1. 程式人生 > 其它 >力扣 二叉樹展開為連結串列(dfs)

力扣 二叉樹展開為連結串列(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)
}