(★★★)二叉樹非遞歸遍歷 (統一的解決思路)

轉載:【刷題】二叉樹非遞歸遍歷html

 

stack<Node*> st;


void preOrder(Node* root) {
    Node *cur = root;
    while (cur || !st.empty()) {
        while (cur) {
            //訪問、入棧、轉向左孩子
            pre.push_back(cur->data);
            st.push(cur);
            cur = cur->lchild;

        }

        if (!st.empty()) {
            //出棧、轉向右孩子
            cur = st.top();
            st.pop();
            cur = cur->rchild;
        }
    }
}

void inOrder(Node* root) {
    Node *cur = root;
    while (cur || !st.empty()) {
        while (cur) {
            //入棧、轉向左孩子
            st.push(cur);
            cur = cur->lchild;
        }

        if (!st.empty()) {
            //出棧、訪問、轉向右孩子
            cur = st.top();
            st.pop();
            in.push_back(cur->data);
            cur = cur->rchild;
        }
    }
}

void postOrder(Node* root) {
    Node *cur = root, *pre = NULL;//pre指向上一個被訪問過的節點
    while (cur || !st.empty()) {
        while (cur) {
            //入棧、轉向左孩子
            st.push(cur);
            cur = cur->lchild;
        }

        if (!st.empty()) {
            //有條件的出棧,
            cur = st.top();
            // 若是已經訪問了右子樹,則能夠訪問根節點;不然轉向,先去訪問右子樹

            if (cur->rchild == NULL || cur->rchild == pre) {
                st.pop();
                post.push_back(cur->data);
                pre = cur;
                cur = NULL;// 表示不須要轉向,繼續彈棧

            }
            else {
                //轉向
                cur = cur->rchild;
            }
        }
    }
}

 

下面這種寫法和筆記中的是統一的post

https://blog.csdn.net/u013161323/article/details/53925313spa

void PostOrder(TreeNode *root) {
    TreeNode *p = root, *r = NULL;
    stack<TreeNode*> s;
    while (p || !s.empty()) {
        if (p) {//走到最左邊
            s.push(p);
            p = p->left;
        }
        else {
            p = s.top();
            if (p->right && p->right != r)//右子樹存在,未被訪問
                p = p->right;
            else {
                s.pop();
                visit(p->val);
                r = p;//記錄最近訪問過的節點
                p = NULL;//節點訪問完後,重置p指針
            }
        }//else
    }//while
}
相關文章
相關標籤/搜索