力扣 二叉树展开为链表(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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值