从前序与中序遍历序列构造二叉树——从后序与中序序列构造二叉树

本文详细介绍了如何使用前序与中序遍历序列以及后序与中序遍历序列来构造二叉树。首先,通过前序遍历序列获取根节点并确定左右子树的边界,在中序遍历序列中找到根节点的位置,然后递归构造左右子树。其次,利用后序遍历序列,遵循先左右子树后根节点的顺序,同样结合中序遍历序列构建二叉树。代码实现中展示了关键的递归函数及其辅助方法。
摘要由CSDN通过智能技术生成

目录

一.从前序与中序遍历序列构造二叉树

题目:

分析:

代码:

二.从后序与中序遍历序列构造二叉树

题目:

分析:

代码:


一.从前序与中序遍历序列构造二叉树

题目:

 

分析:

1.从前序遍历序列可以得到:二叉树从根结点到左子树再到右子树的遍历顺序。

2.从中序遍历序列可以得到:二叉树当前结点的左右子树分别为。

3.遍历前序遍历序列,用中序遍历序列的范围表示对应的左右子树,创建二叉树,创建顺序为先左子树后右子树。

代码:

  public int preIndex = 0;
    public TreeNode createTreeByPandI(int[] preorder,int[] inorder,int inbegin,int inend) {
        if (inbegin > inend) {
            return null;
        }
        //创建根结点
        TreeNode root = new TreeNode(preorder[preIndex]);
        //找到根结点在中序遍历序列中的坐标
        int rootIndex = findIndexOfI(inorder,inbegin,inend,preorder[preIndex]);
        //排除找不到根结点的可能
        if (rootIndex == -1) return null;
        preIndex++;
        root.left = createTreeByPandI(preorder,inorder,inbegin,rootIndex - 1);
        root.right = createTreeByPandI(preorder,inorder,rootIndex + 1,inend);
        return root;
    }

    //找到根结点在中序遍历序列中的坐标
    public int findIndexOfI(int[] inorder,int inbegin,int inend,int key) {
        for (int i = inbegin;i <= inend;i ++) {
            if (inorder[i] == key) {
                return i;
            }
        }
        return -1;
    }
    
    //带入两个序列创建二叉树
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || inorder == null) return null;
        TreeNode root = createTreeByPandI(preorder,inorder,0,inorder.length - 1);
        return root;
    }

二.从后序与中序遍历序列构造二叉树

题目:

 

分析:

1.从后序遍历序列可以得到:二叉树从左子树到右子树再到根结点的遍历顺序。

2.从中序遍历序列可以得到:二叉树当前结点的左右子树分别为。

3.遍历后序遍历序列,用中序遍历序列的范围表示对应的左右子树,创建二叉树,创建顺序为先右子树,后左子树。

代码:

   public int postIndex = 0;
    public TreeNode createTree(int[] inorder,int[] postorder,int inbegin,int inend) {
        if (inend < inbegin) return null;
        //创建结点
        TreeNode root = new TreeNode(postorder[postIndex]);
        //找到该结点在中序遍历序列当中的坐标
        int rootIndex = findIndexOfI(inorder,inbegin,inend,postorder[postIndex]);
        //排除找不到结点的可能
        if (rootIndex == -1) {
            return null;
        }
        postIndex--;
        root.right = createTree(inorder,postorder,rootIndex + 1,inend);
        root.left = createTree(inorder,postorder,inbegin,rootIndex - 1);
        return root;
    }
    //根据该结点的值找到其在中序遍历序列当中的坐标
    public int findIndexOfI(int[] inorder,int inbegin,int inend,int key) {
        for (int i = inbegin;i <= inend;i++) {
            if (inorder[i] == key) {
                return i;
            }
        }
        return -1;
    }

    //带入两个序列创建二叉树
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if (inorder == null || postorder == null) return null;
        postIndex = postorder.length - 1;
        TreeNode root = createTree(inorder,postorder,0,inorder.length - 1);
        return root;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爆裂突破手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值