由題目可以將解題過程分為以下幾個步驟:
1.將當前節點的右子樹連線到當前節點左子樹的最右邊節點的右子樹上
2.將當前節點的左子樹連線到右子樹上,並將左子樹置空
3.將當前節點的右子樹作為新的當前節點,重複上述過程
查詢最右側節點未必需要寫遞迴,寫迴圈也可以,所以我得出做樹的問題,有時候也可以嘗試使用迴圈來解決
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
pre-
>right=root-
>right;
root-
>right=root-
>left;
root-
>left=
nullptr
; root=root-
>right;}}}};
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
void
flatten
(treenode* root)}}
};
題目很明顯是按照先序遍歷去遍歷的二叉樹,但如果按照先序遍歷,將當前節點的右子樹指向左子樹,則右子樹會丟失,但是可以逆序思考(跟先序遍歷正好相反的順序遍歷),這樣右子樹就不會丟失了
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
void
flatten
(treenode* root)
};
既然右子樹會丟失,那就申請乙個棧來存放樹節點,這樣右子樹就不會丟失了
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
if(now-
>right)
sv.push
(now-
>right);if
(now-
>left)
sv.push
(now-
>left)
; pre=now;}}
};
leetcode114 二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。先把左右展開,右放左最後,左放右,左置空 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none clas...
Leetcode 114 二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6 複製 將其展開為 1 2 3 4 5 6 複製 這算是比較經典的一道題目了,博主面試快手的時候原題。最開始一想,覺得遞迴的求解不就好了,但是遞迴的時候發現需要注意乙個地方就是 需要先遞迴右子樹,然後記錄下右子樹展開完成之後...
leetcode 114 二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6將其展開為 1 2 3 4 5 6採用二叉樹後序遍歷 python 如下 class treenode object def init self,x self.val x self.left none self.right ...