剑指offer面试题7:重建二叉树 Java代码实现

剑指offer面试题7:重建二叉树的Java实现



思路基本根据书中的代码,部分代码因Java和c++的不同有少量变化。自己这个Java新手所写,可能存在一些问题,欢迎大家一起探讨!

二叉树节点类代码如下:
public class BinaryTreeNode {
	int value;
	BinaryTreeNode left;
	BinaryTreeNode right;
	
}

重建二叉树的方法:
static BinaryTreeNode construct(int[] preorder, int[] inorder) {
		int length = preorder.length;
		if (preorder == null || inorder == null || length <= 0)
			return null;

		return constructCore(preorder,inorder, 0, length - 1, 0, length - 1);
	}

核心方法:
/**
 * 
 * @param preorder 前序遍历数组
 * @param inorder 中序遍历数组
 * @param startPreorder	每次递归构建树时 数据在前序数组的起始索引
 * @param endPreorder	构建树时 数据在前序数组的结束索引
 * @param startInorder	构建树时 数据在中序数组的起始索引
 * @param endInorder	构建树时 数据在中序数组的结束索引
 * @return
 */
	private static BinaryTreeNode constructCore(int[] preorder,int[] inorder,int startPreorder, int endPreorder, int startInorder, int endInorder) {
		int rootValue=preorder[startPreorder];
		BinaryTreeNode root=new BinaryTreeNode();
		root.value=rootValue;
		root.left=root.right=null;
		
		if(startPreorder==endPreorder){
			if(startInorder==endInorder){
				return root;
			}else{
				System.err.println("invalid input1");
				return null;
			}
		}
		
		//在中序遍历中找到根结点的位置
		int rootInorder=startInorder;
		while(rootInorder<=endInorder&&inorder[rootInorder]!=rootValue)
			rootInorder++;
		
		//如果遍历完中序没有找到对应rootValue的值,说明输入错误
		if(rootInorder==endInorder&&inorder[rootInorder]!=rootValue){
			System.err.println("invalid input2");
			return null;
		}
		
		//计算左右子树在前序数组中的范围
		int leftLength=rootInorder-startInorder;
		int leftPreorderEnd=startPreorder+leftLength;
		
		//构造左子树
		if(leftLength>0){
			root.left=constructCore(preorder, inorder,startPreorder+1, leftPreorderEnd, startInorder, rootInorder-1);
			
		}
		//构造右子树
		if(leftLength<endPreorder-startPreorder){
			root.right=constructCore(preorder, inorder,leftPreorderEnd+1, endPreorder, rootInorder+1, endInorder);
		}
		return root;
	}


//前序遍历输出看结果
	public static void preTraverse(BinaryTreeNode root){
		if(root==null) return ;
		System.out.print(root.value+",");
		preTraverse(root.left);
		preTraverse(root.right);
	}

	public static void main(String[] args) {
		int [] preOrder={1,2,4,7,3,5,6,8};
		int [] inOrder={4,7,2,1,5,3,8,6};
		
		BinaryTreeNode root=construct(preOrder, inOrder);
		preTraverse(root);
	}


输出结果如下:
1,2,4,7,3,5,6,8,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值