首先是原地演算法的定義:
演算法原地工作的含義是指不需要任何額外的輔助,演算法所需要的輔助空間不隨著問題的規模而變化,是乙個確定的值。
通過觀察示例可以知道,我們可以猜想,大方向是前序遍歷。
第一種思路:dfs。設定乙個全域性的指標(這種做法有點脫離原地演算法,因為多開闢了乙個指標變數)核心思想是拿到乙個根節點以後,將其左右子樹斷開。然後將作為全域性變數的右孩子指向剛斷開左孩子和右孩子的根節點(flat->right=root)。形式上同前序遍歷的遞迴形式。
//嘗試使用前序遍歷
class solution
void flatten(treenode* root)
};第二種方法是迭代的方法,我覺得不錯的原因是用到了考研上的迭代尋找左子樹的最右節點等一系列相似操作。
詳見這篇博文的解法二
其中關鍵的的是找左子樹的最右節點:
**為while (p.right != null) ;
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 將根節點和其右子節點斷開,把原右子節點連到原...
114 二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 34 6將其展開為 1 2 3 4 5 6我們發現,如果從最底層的結點開始,都把它的右孩子插入在左孩子的最後乙個結點處,然後再遞迴的調整結果來的這棵樹,則整棵樹滿足題意。為啥?因為最左下的子樹我們都調整好了。也可以認為這是中序遍曆法。...