代码搬运工之二叉树的遍历

熟读力扣300题,不会写题也会敲。
二叉树的题目非常之多,人生是有限的,题目是无限的。
二叉树的遍历
先序(根、左、右)、中序(左、根、右)、后序(左、右、根)
递归的方式很简单。

 //先序遍历
    public static void preOrderTraveral(TreeNode root){
      if(root == null)
          return;
      System.out.println(root.val);
      preOrderTraveral(root.left);
      preOrderTraveral(root.right);
    }
    //中序遍历
    public static void inOrderTraveral(TreeNode root){
        if(root == null)
            return;
        preOrderTraveral(root.left);
        System.out.println(root.val);
        preOrderTraveral(root.right);
    }
    //后序遍历
    public static void postOrderTraveral(TreeNode root){
        if(root == null)
            return;
        preOrderTraveral(root.left);
        preOrderTraveral(root.right);
        System.out.println(root.val);
    }

非递归有没有像递归那样的模板呢?
先序遍历的顺序是当前根、左、右,那么进栈的顺序就是右,左,根
先序遍历

 //先序遍历的顺序是当前根、左、右,那么进栈的顺序就是右,左,根
  public static void preOrderTraveral1(TreeNode root){
        Stack<TreeNode> stack = new Stack<>();
        stack.add(root);
        while (!stack.isEmpty()){
            TreeNode temp = stack.pop();
            if(temp!=null){
                //先序遍历的顺序是当前根、左、右,那么进栈的顺序就是右,左,根
                if(temp.right!=null)
                    stack.add(temp.right);
                if(temp.left!=null)
                    stack.add(temp.left);
                stack.add(temp);
                stack.add(null);//用null值标记当前节点,如果遇到null,那下一个节点就是要输出的
            }
            else {
                TreeNode node = stack.pop();
                System.out.println(node.val);
            }
        }
    }

中序遍历

public static void inOrderTraveral(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
        stack.add(root);
        while (!stack.isEmpty()){
            TreeNode temp = stack.pop();
            if(temp!=null){
                //中序遍历的顺序是左、根、右,那么进栈的顺序就是右,根,根】左
                if(temp.right!=null)
                    stack.add(temp.right);
                stack.add(temp);
                stack.add(null);//用null值标记当前节点,如果遇到null,那下一个节点就是要输出的
                if(temp.left!=null)
                    stack.add(temp.left);
                
            }
            else {
                TreeNode node = stack.pop();
                System.out.println(node.val);
            }
        }
}

后序遍历

public static void postOrderTraveral(TreeNode root){
 Stack<TreeNode> stack = new Stack<>();
        stack.add(root);
        while (!stack.isEmpty()){
            TreeNode temp = stack.pop();
            if(temp!=null){
                //先序遍历的顺序是左、右,根,那么进栈的顺序就是根,右,左
                 stack.add(temp);
                stack.add(null);//用null值标记当前节点,如果遇到null,那下一个节点就是要输出的
                if(temp.right!=null)
                    stack.add(temp.right);
                if(temp.left!=null)
                    stack.add(temp.left);
            }
            else {
                TreeNode node = stack.pop();
                System.out.println(node.val);
            }
        }
}

二叉树非递归遍历可以同一模板了,只要改一下进栈的顺序。

层次遍历,比较简单,直接上菜了。

public static void levelOrderTraveal(TreeNode root){
        if(root==null)
            return;
        Queue<TreeNode> que = new ArrayDeque<>();
        que.add(root);
        while (!que.isEmpty()){
            int size = que.size();
            while (size-->0){
                TreeNode temp = que.poll();
                System.out.println(temp.val);
                if (temp.left!=null)
                   que.add(temp.left);
                if(temp.right!=null)
                    que.add(temp.right);
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值