二叉树的遍历(非递归)

前序遍历
思路:先把根结点放进栈,弹出并加入到res.然后判断右结点是否为空,不为空就入栈,再判断左结点。(由于栈是先进后出,而先序遍历是根、左、右。所以应该先把右结点入栈,然后左结点入栈。)最终返回res。

class Solution{
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new LinkedList<Integer>();
        if(root!=null){
            Deque<TreeNode> stack = new LinkedList<Integer>();
            stack.add(root);
            while (!stack.isEmpty()){
                root = stack.pop();
                res.add(root.val);
                if(root.right!=null){
                    stack.push(root.right);
                }
                if(root.left!=null){
                    stack.push(root.left);
                }
            }
        }
        return res;
    }
}

中序遍历
思路:先从根节点,一路遍历到左结点的最深处,直到为null,然后出栈,并加到res中,再判断是否有右子树,如果没有则出栈,并加到res,如果有,则入栈,再次进行判断,直到遍历结束。

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new LinkedList<Integer>();
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        while (root != null || !stack.isEmpty()) {
            if (root!=null){
                stack.push(root);
                root = root.left;
            }else {
                root = stack.pop();
                res.add(root.val);
                root = root.right;
            }
        }
        return res;
    }
}

后序遍历

思路: 跟先序遍历类似(先序遍历是右结点先入栈,然后左结点入栈)
如果先让左结点入栈,然后让右结点入栈。则res中会出现根、右、左的顺序。这时,如果再来一个栈,用来接收根、右、左的顺序,再出栈,则会出现左、右、根,即后序遍历。

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new LinkedList<Integer>();
        if(root!=null){
           Stack<TreeNode> s1 = new Stack<TreeNode>();
           Stack<TreeNode> s2 = new Stack<TreeNode>();
           s1.push(root);
           while (!s1.isEmpty()){
               root = s1.pop();
               s2.push(root);
               if(root.left!=null){
                   s1.push(root.left);
               }
               if(root.right!=null){
                   s1.push(root.right);
               }
           }
           while (!s2.isEmpty()){
              root = s2.pop();
              res.add(root.val);
           }
       }
       return res;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值