力扣 二叉树展开为链表(dfs)

news/2025/2/22 2:48:10

二叉树展开为链表dfs">力扣 二叉树展开为链表(dfs)

题目链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/

题目的意思是按照其先序遍历的顺序将二叉树展开为链表,要求使用O(1)的内存空间,所以先排除先序遍历出存储起来再构造链表的方法

根据观察,应该是dfs,分为三步:

  • 第一步,将根节点的左子树展开为链表
  • 第二步,将根节点的右子树展开为链表
  • 第三步,将根节点左子树最右边的节点的右孩子指向根节点的右子树

为什么第三步需要这么指向?因为根据先序遍历的性质,其就应该这么指向!

第三步也可以理解为将根节点右子树放在根节点左子树的最右边!

  • 当以2为根节点时,将2的左子树最右边的节点3指向2的右子树4,所以形成了2->3->4
  • 当5为根节点时,5没有左子树,不用修改指向,所以还是5->6
  • 最后当1为根节点时,将1的左子树的最右边的节点4指向1的有子树5->6

参考:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/solution/114-er-cha-shu-zhan-kai-wei-lian-biao-by-ming-zhi-/

func dfs(root *TreeNode){
	if root==nil{
		return
	}

	// 让左右子树分别变成链表
	dfs(root.Left)
	dfs(root.Right)

	// 保存左右子树
	right:=root.Right
	left:=root.Left

	// 将左子树放到其右子树的位置,左子树位置置nil
	root.Right=left
	root.Left=nil

	// 找到其左子树中最右边的节点,让该节点的右子树位置指向其右子树
	for root.Right!=nil{
		root=root.Right
	}
	root.Right=right

}
func flatten(root *TreeNode)  {
	dfs(root)
}

http://www.niftyadmin.cn/n/870327.html

相关文章

【LeetCode】二叉树最大路径和(dfs)

二叉树最大路径和 题目链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/ 分析: 这个题目是求二叉树的最大路径和,要点有两个: 最大不能走回头路:从根节点延伸的路径,你不能走了左子树…

【LeetCode】LRU缓存

LRU缓存 题目链接:https://leetcode-cn.com/problems/lru-cache/ 双向链表map map用来确定链表中是否存在此key的节点 双向链表用来实际存储 每次get,都把get的节点放到链表头部 每次put,两种情况 key存在,更新value,此…

【LeetCode】课程表(图论判环 拓扑排序/dfs)

课程表( 拓扑排序/dfs 判环) 题目链接:https://leetcode-cn.com/problems/course-schedule/ 题目大意:给定一个课程依赖关系图,比如课程A依赖课程B,课程B依赖课程C,按照上述的依赖关系,能否学习完所有的课程…

【LeetCode】删除二叉搜索树中的节点

删除二叉搜索树中的节点 题目链接:https://leetcode-cn.com/problems/delete-node-in-a-bst/ 题目大意:删除指定key的节点,返回root 分析:树是二叉搜索树,要求返回后仍然保持搜索树的位置 二叉搜索树:根节点…

【LeetCode】二叉树的序列化和反序列化(dfs/bfs)

二叉树的序列化和反序列化 题目链接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/ 题目大意:写两个函数,能够分别对二叉树进行序列化和反序列化 方法1:bfs 序列化:采用队列实现&#xff…

Golang 面试题 (1) 用协程交替打印奇偶数

Golang 面试题 (1) 用协程交替打印奇偶数 面试神策数据时,有被问到,答得不太好,记录一下 方法1 两个G,分别打印奇数和偶数无缓冲channel通知这两个G,控制打印顺序 var flagChanmake(chan int)func wokr1(){for i:1;i&l…

【LeetCode】旋转图像(原地算法,找规律)

旋转图像(找规律) 题目链接:https://leetcode-cn.com/problems/rotate-image/ 题目大意:将矩阵顺时针旋转90度,要求原地旋转,空间复杂度O(1) 先水平对折翻转,然后主对角线翻转 func rotate(matrix [][]int) {n:len(ma…

【LeetCode】和为k的子数组(map统计前缀和)

和为k的子数组(map统计前缀和) 题目链接:https://leetcode-cn.com/problems/subarray-sum-equals-k/ 题目分析: 求和为k的子数组数量 我们从暴力解法一步步推导 1.首先最基础的暴力是三层循环,两层分别确定区间起始点,最后一层计算…