二叉树的非递归遍历方式(Java)

二叉树的非递归遍历方式(Java)

前序遍历

思路:就是通过一个栈来实现:

  1. 从root开始,root非空先入栈;

  2. 进入循环判断,若栈非空,则弹出栈顶元素,打印栈顶元素的值

  3. 当弹出的栈顶元素的右子节点非空时,将右子节点压入栈;

  4. 当弹出的栈顶元素的左子节点非空时,将左子节点压入栈;

  5. 直到栈中无元素。

    代码:

    public static ArrayList<Integer> preOrder(TreeNode root){
            ArrayList<Integer> list =new ArrayList<>();
            ArrayDeque<TreeNode> stack=new ArrayDeque<>();
            if(root!=null){
                stack.push(root);
                while(!stack.isEmpty()){
                    root=stack.pop();
                    list.add(root.val);
                    if(root.right!=null){
                        stack.push(root.right);
                    }
                    if(root.left!=null){
                        stack.push(root.left);
                    }
                }
            }
            return list;
        }
    

中序遍历

思路:也是通过一个栈来实现

中序遍历需要一直遍历到最左的子节点,所以

  1. 若左子节点非空,则将此节点压入栈中,执行root=root.left;

  2. 直到左子节点为空,此时弹出栈顶元素,并打印出该栈顶节点的值,并将其右子节点加入栈中;

  3. 循环直至栈中为空。

        public static ArrayList<Integer> inorder(TreeNode root){
            ArrayList<Integer> list=new ArrayList<>();
            ArrayDeque<TreeNode> stack=new ArrayDeque<>();
            if(root!=null){
                while(root!=null || !stack.isEmpty()){
                    if(root!=null){
                        stack.push(root);
                        root=root.left;
                    }else{
                        root=stack.pop();
                        list.add(root.val);
                        root=root.right;
                    }
                }
            }
            return list;
    
    
        }
    

后序遍历

思路:后续遍历需要两个栈进行,因为当前节点要最后打印,所以一个栈复制正常入栈,另一个栈则压入第一个栈弹出的元素,这样就保证了后序性质。

    public ArrayList<Integer> afterOrder(TreeNode root){
        ArrayList<Integer> list=new ArrayList<>();
        ArrayDeque<TreeNode> stack1=new ArrayDeque<>();
        ArrayDeque<TreeNode> stack2=new ArrayDeque<>();
        if (root!=null) {
                    stack1.push(root);
                    while(!stack1.isEmpty()) {
                        root = stack1.pop();
                        stack2.push(root);
                        if (root.left != null) {
                            stack1.push(root.left);
                        }
                        if (root.right != null) {
                            stack1.push(root.right);
                        }
                    }
                    while (!stack2.isEmpty()) {
                        list.add(stack2.pop().val);
                    }
                }
                return list;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值