非递归(二叉树遍历)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/czp_374/article/details/100515801

1 先序遍历

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        //设置栈和存储结果的vector
        stack<TreeNode*> s;
        vector<int> ans;
        //使用根节点初始化游标节点
        TreeNode* t = root;
        //当游标节点非空或者栈非空时
        while(t || !s.empty()){
            if(t){
                //如果游标节点非空
                ans.push_back(t->val);
                //游标节点入栈
                s.push(t);
                //更新游标节点
                t = t->left;
            }else{
                //使用父节点的右孩子更新游标节点
                t = s.top()->right;
                //栈顶元素出栈
                s.pop();
            }//if
        }//while
        return ans;
    }
};

2 中序遍历

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        //设置栈和存储结果的vector
        stack<TreeNode*> s;
        vector<int> ans;
        //使用根节点初始化游标节点
        TreeNode* t = root;
        //当游标节点非空或者栈非空时
        while(t || !s.empty()){
           //遍历到最左边的叶结点
            while(t){ s.push(t); t = t->left;}
            if(!s.empty()){
                //输出栈顶元素
                ans.push_back(s.top()->val);
                //使用栈顶元素的右指针更新游标指针
                t = s.top()->right;
                //栈顶元素出栈
                s.pop(); 
            }//if
        }//while
        return ans;
    }
};
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        //设置栈和存储结果的vector
        stack<TreeNode*> s;
        vector<int> ans;
        //使用根节点初始化游标节点
        TreeNode* t = root;
        //当游标节点非空或者栈非空时
        while(t || !s.empty()){
           //遍历到最左边的叶结点
            if(t){ 
                s.push(t); 
                t = t->left;
            }else{
                //输出栈顶元素
                ans.push_back(s.top()->val);
                //使用栈顶元素的右指针更新游标指针
                t = s.top()->right;
                //栈顶元素出栈
                s.pop(); 
            }//if
        }//while
        return ans;
    }
};

3 后序遍历

// //////// 严格按照后序遍历的定义
class Solution {
public:
    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> v;
        stack<TreeNode*> s_stack;
        
        TreeNode *node = root;
        TreeNode *lastVisitNode = NULL;
        while (!s_stack.empty() || node != NULL){
            if (node != NULL){
                // keep going the left
                s_stack.push(node);
                node = node->left;
            }
            else{
                TreeNode *n = s_stack.top();
                // left way is finsised, keep going to the right way
                if (n->right != NULL && lastVisitNode != n->right){
                    node = n->right;
                }
                else{
                    // both left and right has been accessed.
                    s_stack.pop();
                    v.push_back(n->val);
                    //更新上次被访问的节点
                    lastVisitNode = n;
                }
            }
        }
        return v;
    }
};

猜你喜欢

转载自blog.csdn.net/czp_374/article/details/100515801