二叉树遍历(迭代法)

1.前序遍历

        通过栈来模拟递归,先将根节点放进栈,循环条件为栈不为空,每次将栈顶弹出并加入结果数组,若不为空则将其右节点入栈,左节点入栈,这样是因为栈先进后出,保证左节点先出栈。

vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> ans;
        ans.push(root);
        while(!ans.empty())
        {
            TreeNode *node=ans.top();
            ans.pop();
            if(node==NULL)
            continue;
            res.push_back(node->val);
            ans.push(node->right);
            ans.push(node->left);
        }
        return res;
    }

2.中序遍历

        中序遍历与先序后续都不相同,要将节点访问与节点处理分开进行,创建指针指向根节点,循环条件为指针或栈不为空,若节点不为空则将指针指向左节点,为空则将指针指向栈顶并将栈顶弹出,同时将栈顶数据存入结果数组,再将指针指向右节点。

vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> ans;
        TreeNode* node=root;
        while(node!=NULL||!ans.empty())
        {
            if(node!=NULL)
            {
                ans.push(node);
                node=node->left;
            }
            else
            {
                node=ans.top();
                res.push_back(node->val);
                ans.pop();
                node=node->right;
            }
        }
        return res;
    }

2.后序遍历

        先序遍历为根左右,后序遍历为左右根,将先序遍历左右节点进栈顺序更换则变为根右左,再将得到的结果数组反转为左右根,即为后序遍历。

vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> ans;
        ans.push(root);
        while(!ans.empty())
        {
            TreeNode *node=ans.top();
            ans.pop();
            if(node==NULL)
            continue;
            res.push_back(node->val);
            ans.push(node->left);
            ans.push(node->right);
        }
        reverse(res.begin(),res.end());
        return res;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值