1.トピックの紹介
二分木が与えられたら、それを単一リンクリストに展開します。
たとえば、二分木が与えられた
1
/ \
2 5
/ \ \
3 4 6次の
ように展開します:
1
\
2
\
3
\
4
\
5
\
6
ソース:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2つの問題解決のアイデア
この問題を解決するアイデアは、最初に事前順序トラバーサルの方法でバイナリツリーをトラバースし、トラバーサルの結果をリンクリストに保存することです;次に、リンクリスト内のノードの順序に従って、各ノードの左側のノードをNULLに向け、それを右に向けます。ノードは、現在のリンクリストノードの次のノードを指します。ただし、2つのトラバーサルによって複雑さが増すことを考慮すると、バイナリツリーのプレオーダートラバーサルとリンクリストの展開は一緒に完了します。事前注文トラバーサルを開始する前に、prevノードをNULLに定義します。トラバーサルプロセスでは、最初にprevノードがNULLかどうかを判断します。NULLでない場合は、左側のノードをNULLに、右側のノードをcurr(現在のノード)に設定します。 ); NULLの場合は、引き続きバイナリツリーを走査し、現在のノードの右の子と左の子を順番にスタック構造に保存してから、prevをcurrに割り当てます。このルールに従って、トラバーサル全体を完了します。
3つの問題解決コード
class Solution {
public:
void flatten(TreeNode* root) {
if(root == NULL)
return;
stack<TreeNode*> st;
TreeNode* prev = NULL;
TreeNode* curr = NULL;
st.push(root);
while(!st.empty())
{
curr = st.top();
st.pop();
if(prev != NULL)
{
prev->left = NULL;
prev->right = curr;
}
TreeNode* left = curr->left;
TreeNode* right = curr->right;
if(right != NULL)
st.push(right);
if(left != NULL)
st.push(left);
prev = curr;
}
}
};