LeetCode114-リンクリストに展開されたバイナリツリー

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;
        }
    }
};

4つの問題解決の結果

おすすめ

転載: blog.csdn.net/qq_39661206/article/details/113105277