難度:中等
題目描述
解題思路
又是一道我看不懂答案的遞迴題
大概就是先後序遍歷,按照前序遍歷的順序,把左子樹放到右子樹,把本來的右子樹接上去,記得要置空左子樹
可以用遞迴和非遞迴
/*
* 114. 二叉樹展開為鍊錶
* 2020/8/2
*/public
void
flatten
(treenode root)
// 將左子樹展開為單鏈表
flatten
(root.left)
;// 將右子樹展開為單鏈表
flatten
(root.right)
;// 暫存右子樹,這個右子樹應該是最左邊節點的右子樹
treenode temp = root.right;
//左節點的值給右節點
root.right = root.left;
//左節點置空
root.left= null;
//然後把之前的右節點接到新右節點後面
while
(root.right != null)
root.right = temp;
}
非遞迴的思路也很像,就是用自己定義的棧來模擬系統棧遞迴的過程,把所有的左孩子入棧,然後每次出棧乙個左孩子,完成交換的過程。
public
void
flatten1
(treenode root)if(
!stack.
isempty())}}
以題目的樣例,出棧的順序是3 2 4 1 5 6
先把2 3 4變成符合要求的,然後接到根1上,把1的右子樹接到4後面,就成了123456
114 二叉樹展開為鍊錶
首先是原地演算法的定義 演算法原地工作的含義是指不需要任何額外的輔助,演算法所需要的輔助空間不隨著問題的規模而變化,是乙個確定的值。通過觀察示例可以知道,我們可以猜想,大方向是前序遍歷。第一種思路 dfs。設定乙個全域性的指標 這種做法有點脫離原地演算法,因為多開闢了乙個指標變數 核心思想是拿到乙個...
114 二叉樹展開為鍊錶
一開始寫的 114 二叉樹展開為鍊錶 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none class solution def flatt...
114 二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6將其展開為 1 2 3 4 5 6思路 從題目可以看出來要求先根遍歷。從根節點開始出發,先檢測其左子結點是否存在 1 找到左子結點最後面的右子節點 如果沒有,就是左子節點本身 2 將根節點和其右子節點斷開,把原右子節點連到原...