剑指offer--算法题--05--重构二叉树

时间限制:1 秒                                            

内存限制:32 兆

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。

package jzoffer;


public class reConstructBinaryTree {
	/** 
     * 一棵二叉树 
     * <pre> 
     *             A(1) 
     *       B(2)        C(3)  
     *    D(4)   E(5)        F(6)  
     *  </pre> 
     *  A:1 B:2 C:3 D:4 E:5 F:6
     *  前序遍历:1 2 4 5 3 6
     *  中序遍历:4 2 5 1 3 6
     *  后续遍历:4 5 2 6 3 1
     * @param root 
     * @author LSM 
     */  
	public static void main(String[] args) {
		int [] preOrder = {1,2,4,5,3,6};
		int [] inOrder  = {4,2,5,1,3,6};
		BinaryTreeNode node = reConstruct(preOrder, inOrder);
		System.out.println("后续遍历结果为(4 5 2 6 3 1):");
		printTree(node);
	}
	public static BinaryTreeNode reConstruct(int [] preOrder, int [] inOrder){
		if(preOrder == null || inOrder == null || preOrder.length!=inOrder.length || preOrder.length<1){
			return null;             //特殊情况的判断
		}
		return construct(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1); //方法调用进行递归
	}
	public static BinaryTreeNode construct(int [] preOrder,int ps,int pe,int [] inOrder,int is ,int ie){
		if(ps>pe){      //目前还不知道这句话什么意思
			return null;
		}
		int value = preOrder[ps]; //将前序遍历也就是第一个根节点保存下来
		int index = is; //index的创建是为了进行后序遍历中找到根节点的位置
		
		while(index<=ie && inOrder[index] != value){
			index ++;
		}               //通过这个while循环,我们就可以找到在中序遍历序列中的根节点的位置
		//如果在中序遍历的过程中 我们没有找到 那就是输入的不合法了
		if(index >ie){
			System.out.println("输入不合法------");
			return null;
		}
		BinaryTreeNode node = new BinaryTreeNode();//新构造一棵树
		node.value = value;  //否则将找到的vlue(根节点)给新构造的一棵树 也就是这个新树的根节点
		//接下来我们就要进入递归了,先是要进入左子树的递归,我们需要左子树的前序遍历,后序遍历的结果集合 进行递归
		//当前节点(也就是根节点)的左子树的个数为 index-is      要知道他的个数 然后进而算出他的位置
		//左子树对应的前序遍历的位置在preOrder[ps+1,ps+index-is] 这个也就是左子树前序遍历的 元素数组
		//左子树对应的中序遍历的位置在preOrder[0,index-is]       这个也就是左子树中序遍历的元素数组
	    node.left = construct(preOrder, ps+1, ps+index-is, inOrder,0,index-is); //左子树递归
	    //当前节点(也就是根节点)的右子树的个数为 ie-index 要知道他的个数 然后进而算出他的位置
	    //右子树对应的前序遍历位置在preOrder[ps+index-is+1,pe]  这个也就是右子树前序遍历的 元素数组
	    //右子树对应的中序遍历位置在inOrder[index+1,ie]
	    node.right=construct(preOrder,ps+index-is+1,pe,inOrder,index+1,ie);     //右子树递归
		return node;                 //返回我们自己构造的这棵树
	}
    public static void printTree(BinaryTreeNode binaryTreeNode){
    	if(binaryTreeNode != null){
    		printTree(binaryTreeNode.left);
    		printTree(binaryTreeNode.right);
    		System.out.print(binaryTreeNode.value+" ");
    	}
    }
}

class BinaryTreeNode{
	int value;
	BinaryTreeNode left;
	BinaryTreeNode right;
	public BinaryTreeNode(int value){
		this.value = value;
	}
	public BinaryTreeNode() {
	}
}

猜你喜欢

转载自blog.csdn.net/lsm18829224913/article/details/80303769
今日推荐