前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二叉树的非递归遍历(leetcode)

二叉树的非递归遍历(leetcode)

原创
作者头像
euclid
修改2020-01-07 09:51:00
4370
修改2020-01-07 09:51:00
举报
文章被收录于专栏:Euclid学习日记

尝试二叉树的迭代遍历

前序遍历

代码语言:c++
复制
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> s;
        TreeNode* tmp = root;

        while(!s.empty() || tmp){
            while(tmp){
                res.push_back(tmp->val);
                s.push(tmp);
                tmp = tmp->left;
            }
            tmp = s.top();
            s.pop();
            tmp = tmp->right;
        }
        return res;
    }
};

中序遍历

代码语言:txt
复制
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        TreeNode* tmp = root;
        vector<int> res;
        stack<TreeNode*> s;
        while(!s.empty() || tmp){
            while(tmp){
                s.push(tmp);
                tmp = tmp->left;
            }
            tmp = s.top();
            s.pop();
            res.push_back(tmp->val);
            tmp = tmp->right;
        }
        return res;
    }
};

后序遍历

后序遍历迭代方法和前中遍历的迭代方法类似,但是差别在于后序遍历的顺序是left->right->root;所以我们在从栈中弹出访问一个left之后,要判断当前root->right是否存在或是否访问,若是存在且未访问,访问root的右子树之后才可以访问当前root节点。

方法一

后序遍历:left->right->root;

前序遍历:root->left->right;

改编前序遍历:root->right->left; (之后再逆序输出就是后序遍历)

代码语言:c++
复制
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> s;
        TreeNode* tmp = root;
        while(tmp || !s.empty()){
            while(tmp){
                res.push_back(tmp->val);
                s.push(tmp);
                tmp = tmp->right;
            }
            tmp = s.top();
            s.pop();
            tmp = tmp->left;
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

方法二

直接用pre判断是否访问过root->right;若是访问过pre == root->right,未访问则为NULL;

代码语言:c++
复制
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> s;
        TreeNode* tmp = root;
        TreeNode* pre = NULL;

        while(tmp || !s.empty()){
            while(tmp){
                s.push(tmp);
                tmp = tmp->left;
            }
            tmp = s.top();

            //判断tmp的右节点是否存在或者是否访问过
            //若是存在且访问过或是右节点不存在
            if(tmp->right==NULL || pre==tmp->right){
                res.push_back(tmp->val);
                s.pop();
                pre = tmp;
                tmp = NULL;
            }
            //若是未访问过
            else{
                tmp = tmp->right;
                pre = NULL;
            }
        }
        return res;
    }
};

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 尝试二叉树的迭代遍历
    • 前序遍历
      • 中序遍历
        • 后序遍历
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档