Java数据结构:前序和中序还原二叉树

根据二叉树前根中根遍历出来的数组还原二叉树。

前根:ABDGCEFH           中跟:DGBAECHF

Java数据结构:前序和中序还原二叉树_第1张图片

 

原理:先从前序的第一个结点开始,其为根节点,然后在中序中找到该元素,一分为二,中序左边为左子树,右边为右子树,然后从前序中找第二个元素为根结点左子树的根,然后重复上面这个过程,发现出现NULL,跳到右子树(一定要控制好i和k的值,我不会盲写,嘤嘤嘤)。

 

方案一

过程:

首先从a开始,查询到a的n=8(前根序列的长度),i=3(由代码计算),然后递归左子树,A的左子树为B计算得B.n=A.i=3  .B.i=2

此时递归B的左子树,B.Left=D,此时n=2,i=0...出现了0及D.left=null.然后发现进行递归D的右子树。。。。大家顺着思路过一遍就差不多懂了。

上代码:

    private BinaryNode create(T[] prelist, T[] inlist, int preStart, int inStart, int n)
    {
        if (n<=0)
            return null;       
 

T elem=prelist[preStart];                          //根结点值
        BinaryNode p=new BinaryNode(elem); //创建叶子结点
        int i=0;
        while (i

方案二

与一类似,将一中的i改成了有固定开始结束的参数,跟着代码脑跑一下程序自然就明白了

上代码:

public BinaryNode buildTree1(int preStart, int inStart, int inEnd,
			String preorder, String inorder) {
		if (inStart > inEnd || preStart > preorder.length())
			return null;
		char rootValue = preorder.charAt(preStart);
		BinaryNode root = new BinaryNode(rootValue);
		int k = 0;
		for (int i = 0; i < preorder.length(); i++) {
			if (inorder.charAt(i) == rootValue) {
				k = i;
				break;
			}
		}
		root.left = buildTree1(preStart + 1, inStart, k - 1, preorder, inorder);
		root.right = buildTree1(preStart + 1 + k - inStart, k + 1, inEnd,
				preorder, inorder);
		return root;
	}

 

 

你可能感兴趣的:(数据结构/算法)