树的先序、中序、后序遍历

static public class TreeNode {
          int val;
          TreeNode left;
          TreeNode right;
          TreeNode() {}
          TreeNode(int val) { this.val = val; }
          TreeNode(int val, TreeNode left, TreeNode right) {
              this.val = val;
              this.left = left;
              this.right = right;
          }
      }

先序遍历

/**
     * 先序遍历
     * @param root
     * @return
     */
    public static List<Integer> inorderTraversal2(TreeNode root) {
        ArrayList<Integer>list=new ArrayList<>();
        Stack<TreeNode> stack=new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            System.out.print(node.val);
            if(node.right!=null) stack.push(node.right);
            if(node.left!=null) stack.push(node.left);
        }
        return list;
    }

中序遍历

/**
     * 中序遍历
     * @param root
     * @return
     */
    public static List<Integer> inorderTraversal0(TreeNode root) {
        ArrayList<Integer>list=new ArrayList<>();
        Stack<TreeNode> stack=new Stack<>();
        TreeNode cur = root;
        Stack<Integer> num = new Stack<>();
        while (cur!=null||!stack.isEmpty()){
            if(cur!=null){
                stack.push(cur);
                cur = cur.left;
            }else {
                cur = stack.pop();
                System.out.print(cur.val);
                cur = cur.right;
            }
        }
        return list;
    }

后序遍历

采用双压栈的方式,第二次弹出时才打印自己值

/**
     * 后续遍历
     * @param current
     * @return
     */
    public static List<Integer> inorderTraversal3(TreeNode current) {
        ArrayList<Integer>list=new ArrayList<>();
        Stack<TreeNode> stack=new Stack<>();
        stack.push(current);
        stack.push(current);
        while (!stack.isEmpty()) {
            current = stack.pop();
            if (!stack.isEmpty() && current == stack.peek()) {
                if (current.right != null) {
                    stack.push(current.right);
                    stack.push(current.right);
                }
                if (current.left!= null) {
                    stack.push(current.left);
                    stack.push(current.left);
                }
            } else {
                System.out.print(current.val);
            }
        }
        return list;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 和后都是二叉的方法,它们的区别在于访问根节点的顺和访问左右子的顺不同。 1. 的访问顺是:根节点 -> 左子 -> 右子。 例如,对于下面这棵二叉: ``` 1 / \ 2 3 / \ / \ 4 5 6 7 ``` 其列为:1 2 4 5 3 6 7。 2. 的访问顺是:左子 -> 根节点 -> 右子。 例如,对于下面这棵二叉: ``` 1 / \ 2 3 / \ / \ 4 5 6 7 ``` 其列为:4 2 5 1 6 3 7。 3. 后的访问顺是:左子 -> 右子 -> 根节点。 例如,对于下面这棵二叉: ``` 1 / \ 2 3 / \ / \ 4 5 6 7 ``` 其后列为:4 5 2 6 7 3 1。 希望这个回答能够解决您的疑惑。 ### 回答2: 和后是二叉的三种常见遍方式。 访问根节点,然后遍左子,最后遍右子。在遍的过程,根节点总是在左子和右子之前被访问到。 左子,然后访问根节点,最后遍右子。在遍的过程,根节点总是在左子和右子之间被访问到。 后左子,然后遍右子,最后访问根节点。在遍的过程,根节点总是在左子和右子之后被访问到。 以一个简单的二叉为例,如下所示: A / \ B C / \ \ D E F :A -> B -> D -> E -> C -> F :D -> B -> E -> A -> C -> F 后:D -> E -> B -> F -> C -> A 其的访问顺是根节点->左子->右子的访问顺是左子->根节点->右子,后的访问顺是左子->右子->根节点。 这三种遍方式都有自己的应用场景。常用于打印表达式,常用于二叉搜索输出,后常用于计算二叉的表达式。 总之,和后是对二叉的不同遍,每种遍方式都有自己的特点和应用场景。 ### 回答3: 和后都是二叉的方法。下面分别对这三种遍进行简单的说明。 是指从根节点开始,根节点,然后按照的顺,递归遍左子和右子。具体步骤如下:输出根节点,然后递归遍左子,最后递归遍右子是指从根节点开始,递归遍左子,然后输出根节点,最后再递归遍右子。具体步骤如下:递归遍左子,然后输出根节点,最后递归遍右子。 后是指从根节点开始,递归遍左子,然后递归遍右子,最后输出根节点。具体步骤如下:递归遍左子,然后递归遍右子,最后输出根节点。 这三种遍方法都是通过递归的方式实现的,其的次不同,而后的次更为靠后。不同的遍方式可以帮助我们了解二叉结构的不同特点,如可以轻松找到二叉的根节点,可以输出二叉的有节点列,后可以方便地进行二叉的删除操作。 总结起来,和后都是二叉的方法,只不过它们的递归次不同。熟练掌握这三种遍方式可以帮助我们更好地理解二叉的结构和特点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值