二叉树的前序、中序和后序遍历(Java实现)


前言

二叉树一遍有前序、中序和后序三种遍历方式,不同的遍历方式有不同的用处。
二叉树遍历都是先左后右的。
二叉树类:

public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode() {
    }

    public TreeNode(int val) {
        this.val = val;
    }

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

在这里插入图片描述
构建这颗树:

        TreeNode root = new TreeNode(4);
        TreeNode temp1 = new TreeNode(1);
        TreeNode temp2 = new TreeNode(2);
        TreeNode temp3 = new TreeNode(3);
        TreeNode temp5 = new TreeNode(5);
        root.left = temp2;
        root.right = temp5;
        temp2.right = temp3;
        temp2.left = temp1;

一、前序

1. 中左右进行遍历:

  1. 遍历根节点
  2. 遍历根节点的左节点(如果左节点不是叶子节点,则以当前节点开始,重新从第一步开始)
  3. 遍历根节点的右节点(如果右节点不是叶子节点,则以当前节点开始,重新从第一步开始)

2. 代码实现

    public void pre(TreeNode root) {
        if (root == null)
            return;
        System.out.print(root.val);
        pre(root.left);
        pre(root.right);
    }

结果为42135
在这里插入图片描述

二、中序

1. 左中右进行遍历

  1. 遍历根节点的左节点(如果左节点不是叶子节点,则以当前节点开始,重新从第一步开始)
  2. 遍历根节点
  3. 遍历根节点的右节点(如果右节点不是叶子节点,则以当前节点开始,重新从第一步开始)

2. 代码实现

    public static void cur(TreeNode root) {
        if (root == null)
            return;
        cur(root.left);
        System.out.print(root.val);
        cur(root.right);
    }

结果为:12345
在这里插入图片描述

三、后序

1. 左右中进行遍历

  1. 遍历根节点的左节点(如果左节点不是叶子节点,则以当前节点开始,重新从第一步开始)
  2. 遍历根节点的右节点(如果右节点不是叶子节点,则以当前节点开始,重新从第一步开始)
  3. 遍历根节点

2. 代码实现

    public static void nxt(TreeNode root) {
        if (root == null)
            return;
        nxt(root.left);
        nxt(root.right);
        System.out.print(root.val);
    }

结果为:13254
在这里插入图片描述

四、逆推二叉树

  • 前序加中序可以逆推二叉树;
	//记录前序中的位置
    int key = 0;
    
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return function(preorder,inorder,0,inorder.length - 1);
    }

    public TreeNode function(int[] preorder, int[] inorder,int left,int right){
        if (left == right){
            TreeNode node = new TreeNode(preorder[key]);
            key++;
            return node;
        } else if (left > right)
            return null;
        int rootIndex = 0;
        for (int i = left; i <= right; i++) {
            if (inorder[i] == preorder[key]){
                rootIndex = i;
                break;
            }
        }
        TreeNode node = new TreeNode(preorder[key]);
        key++;
        node.left = function(preorder,inorder,left,rootIndex - 1);
        node.right = function(preorder, inorder, rootIndex+1, right);
        if (node.left == node.right)
            key--;
        return node;
    }
  • 后序加中序可以逆推二叉树;
  • 前序加后序不能逆推二叉树;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值