根据先序和中序数组构建二叉树

Posted it_worker365

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据先序和中序数组构建二叉树相关的知识,希望对你有一定的参考价值。

首先根据定义,先序的第一个元素为根节点,由于规定元素没有重复,所以可以根据根节点数值来将中序遍历数组中左右子数分开。

同时根据左右子数的个数继续拆分对应的先序数组,递归左右子树得到结果

/**
 * Created by itworker365 on 5/12/2017.
 */
public class RebuildBTree {
    //有一个前提是元素无重复
    public static void main(String[] args) {
        //根左右
        int[] preTrace = {1,2,4,7,3,5,6,8};
        //左根右
        int[] midTrace = {4,7,2,1,5,3,8,6};
        RebuildBTree rebuildBTree = new RebuildBTree();
        TreeNode treeNode = rebuildBTree.reConstructBinaryTree(preTrace, midTrace);
    }
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if (pre.length == 0 || in.length == 0) {
            return null;
        }
        return reConstructBinaryTree111(pre, 0, pre.length - 1, in, 0, in.length - 1);
    }
    public TreeNode reConstructBinaryTree111(int [] pre,int pstart, int pend, int [] in, int istart, int iend) {
        if (pstart > pend || istart > iend) {
            return null;
        }
        TreeNode root=new TreeNode(pre[pstart]);
        //首先由先序遍历知道第一个元素肯定是根元素,遍历中序找,找到根节点
        //将中序结果分为两个子子数,根据元素个数同时拆分先序数组,分别构建左右子树
        for(int i = istart; i <= iend; i++)
            if(in[i] == pre[pstart]){
                root.left = reConstructBinaryTree111(pre, pstart + 1, pstart + i - istart, in, istart, i - 1);
                root.right = reConstructBinaryTree111(pre, i - istart + pstart + 1, pend, in, i + 1, iend);
            }
        return root;
    }
}
class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) {
        val = x;
    }

    public void setLeft(TreeNode left) {
        this.left = left;
    }

    public void setRight(TreeNode right) {
        this.right = right;
    }
}

 

以上是关于根据先序和中序数组构建二叉树的主要内容,如果未能解决你的问题,请参考以下文章

根据先序和中序构建二叉树(java)后序输出

根据先序和中序实现后序

由先序和中序重建二叉树

根据后序和中序遍历输出先序遍历

PTA 根据后序和中序遍历输出先序遍历(25 分)

知道二叉树的先序和中序遍历,重建该二叉树