[LeetCode] 144. 二分木の事前順序走査、94. 二分木のインオーダー走査、145. 二分木の事後走査

 著者: シャオ・ルー

コラム:「リートコード」

好きな言葉:立ち上がる若者のおかげで世界はもっと美しい。—— 『人民日報』


 144. バイナリツリーの事前注文トラバーサル

144. バイナリツリーの事前注文トラバーサル

トピック:

バイナリ ツリーのルート ノードを指定すると 、root そのノード値の 事前順序 走査を返します。

例:

アイデア:

バイナリ ツリーの最後まで進むと、左端のパスができ、これを左サブパスと呼びます。バイナリ ツリーを左サブパスと右サブパスに分割できます。左サブパスノードなど。

スタックを使用して左側のサブウェイを保存し、最後に到達した場合はスタックの最上部をポップアウトし、スタックの最上部にある右側のサブツリーをトラバースして循環します。 

コード:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*>st;
        vector<int>v;
        TreeNode*cur=root;
        while(cur||!st.empty())
        {
            while(cur)
            {
                st.push(cur);
                v.push_back(cur->val);
                cur=cur->left;
            }
            TreeNode*top=st.top();
            st.pop();
            cur=top->right;
        }
        return v;
    }
};

 94. 二分木のインオーダートラバース

94. 二分木のインオーダートラバース

トピック:

バイナリ ツリーのルート ノードを指定すると root 、 その 順序 トラバーサルを返します。  

例:

コード:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        stack<TreeNode*>st;
        vector<int>v;
        TreeNode*cur=root;
        while(cur||!st.empty())
        {
            while(cur)
            {
                st.push(cur);
                cur=cur->left;
            }
 
                TreeNode*top=st.top();
                st.pop();
                v.push_back(top->val);
                
                    cur=top->right;
        }
        return v;
    }
};

 145. 二分木の事後走査

 145. 二分木の事後走査

 トピック:

バイナリ ツリーのルート ノードを指定すると root 、 そのノード値の事後探索を 返します。

例:

 コード:

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*>st;
        vector<int>v;
        TreeNode*cur=root;
        TreeNode*prev=nullptr;
        while(cur||!st.empty())
        {
            //左子路
            while(cur)
            {
                st.push(cur);
                cur=cur->left;
            }
            //从栈里面取到左子路的节点
            TreeNode*top=st.top();
            //这里右不存在或者右子树已经遍历了,才可以
            //prev记录上一个节点,如果prev是top的父亲,就说明右子树已经遍历了
            if(top->right==nullptr||top->right==prev)
            {
                v.push_back(top->val);
                st.pop();
                prev=top;
            }
            else
            {
                cur=top->right;

            }
        }
            return v;
        
    }
};

おすすめ

転載: blog.csdn.net/m0_69061857/article/details/131062666