力扣 二叉樹展開為連結串列(dfs)
阿新 • • 發佈:2022-03-10
力扣 二叉樹展開為連結串列(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
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) }