树的非递归遍历

1.先序(我只把这些当模板)

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root==NULL)return res;
        stack<TreeNode*> ms;
        TreeNode* p=root;
        while(!ms.empty()||p)
        {
            if(p)
            {
                res.push_back(p->val);
                ms.push(p);
                p=p->left;
            }
            else if(!ms.empty())
            {
                p=ms.top();
                ms.pop();
                if(p)p=p->right;
            }
        }
        return res;
    }
};


2.中序

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



3.后序

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root==NULL)return res;
        stack<TreeNode*> ms;
        TreeNode *p=root,*pre=NULL;
        while(!ms.empty()||p)
        {
            if(p)
            {
                ms.push(p);
                p=p->left;
            }
            else
            {
                p=ms.top();
                if(p->right!=NULL&&p->right!=pre)p=p->right;
                else 
                {
                    res.push_back(p->val);
                    ms.pop();
                    pre=p;
                    p=NULL;
                }
            }
        }
        return res;
    }
};




看看大神的代码(以下代码来源于leetcode)

1.先序(看起来很优美)

class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
    if (root==NULL) {
        return vector<int>();
    }
    vector<int> result;
    stack<TreeNode *> treeStack;
    treeStack.push(root);
    while (!treeStack.empty()) {
        TreeNode *temp = treeStack.top();
        result.push_back(temp->val);
        treeStack.pop();
        if (temp->right!=NULL) {
            treeStack.push(temp->right);
        }
        if (temp->left!=NULL) {
            treeStack.push(temp->left);
        }
    }
    return result;
}
};



2.中序( o(1)空间复杂度)

Morris traversal

 
 

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        if(root == null) return new ArrayList<Integer>();
        List<Integer> res = new ArrayList<Integer>();
        TreeNode pre = null;
        while(root != null){
        	if(root.left == null){
        		res.add(root.val);
        		root = root.right;
        	}else{
        		pre = root.left;
        		while(pre.right != null && pre.right != root){
        			pre = pre.right;
        		}
        		if(pre.right == null){
        			pre.right = root;
        			root = root.left;
        		}else{
        			pre.right = null;
        			res.add(root.val);
        			root = root.right;
        		}
        	}
        }
        return res;
    }
}


3.后序(美得不敢直视)

vector<int> postorderTraversal(TreeNode *root) {
    vector<int> v;
    if (!root) return v;
    
    stack<TreeNode *> s;
    s.push(root);
    
    TreeNode *p = NULL;
    while(!s.empty()) {
        p = s.top();
        s.pop();
        v.insert(v.begin(), p->val);
        if (p->left) s.push(p->left);
        if (p->right) s.push(p->right);
    }
    
    return v;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值