树的非递归遍历

树的非递归遍历

前序遍历和中序遍历

    //前序遍历
    vector<int> res;
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> stk;
        while(!stk.empty()||root!=NULL){
            if(root!=NULL){
                res.push_back(root->val);
                stk.push(root);
                root = root->left; 
            }else{
                root = stk.top();
                stk.pop();
                root = root->right;
            }
        }
        return res;
    }
    //中序遍历
    vector<int> res;
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> stk;
        while(!stk.empty()||root!=NULL){
            if(root!=NULL){
                stk.push(root);
                root = root->left;
            }else{
                root = stk.top();
                res.push_back(root->val);
                stk.pop();
                root = root->right;
            }
        }
        return res;
    }

后序遍历

    vector<int> res;
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> stk;
        TreeNode* r;//上一个访问的是谁
        while(!stk.empty()||root!=NULL){
            if(root!=NULL){
                stk.push(root);
                root = root->left;
            }else{
                //右子树没有访问
                if(stk.top()->right!=NULL&&stk.top()->right!=r){
                    root = stk.top()->right;
                }else{
                    //右子树已经访问,所以访问父节点
                    res.push_back(stk.top()->val);
                    r = stk.top();
                    stk.pop();
                }
            }
        }
        return res;
   }

后续遍历的特点:

访问一个节点p时,栈中的结点刚好是p结点的所有祖先,从栈底到栈顶即一条根到p的路径

相关题目:
1.求根到某结点的路径
2.求俩个结点的最近公共祖先

posted @ 2023-05-31 16:53  韩炭炭  阅读(14)  评论(0)    收藏  举报