算法第二周作业02

Description

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

Solutions

某颗树的先序遍历:ABCDEFG,中序遍历:CBDAFGE。首先由先序遍历的第一个节点A可以得知(先序遍历的特点):这棵树的根节点为A;

根据中序遍历可以得到A节点左边的节点BCD为左子树节点(先序BCD,中序CBD),A节点右边的节点EFG为右子树节点(先序EFG,中序FGE)。

对于左子树BCD,左子树的根节点为B,由中序遍历得知B节点左边的节点C属于左子树,右边节点D属于右子树;

以此类推。。。。。。采用深度递归方式构造整棵树。

Code

数的结构:

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;

	TreeNode(int x) {
		val = x;
	}
}


算法如下:

public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
		// 输入数据合法性校验
		if (pre == null || in == null || pre.length != in.length) {
			return null;
		}
		// 进入构造树的递归函数
		return buildTree(pre, in);
	}

	public TreeNode buildTree(int[] pre, int[] in) {
		// 每次创建子树的根节点
		TreeNode result = new TreeNode(pre[0]);
		// 如果该子树只有一个节点则直接返回该树
		// 否则需要递归设置左右子树
		if (pre.length != 1) {
			int i = 0;
			for (; i < in.length; i++) {
				if (pre[0] == in[i]) {
					break;
				}
			}
			// 如果有左子树,则构造左子树,其中Arrays.copyOfRange用于避免索引越界判断麻烦,
			// 当然也可以使用左右边界索引代替copyOfRange,这样的话输入参数会很多
			// 例如:buildTree(int[] pre, int[] in, int start1, int end1, int start2, int end2)
			if (i > 0) {
				result.left = buildTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(in, 0, i));
			}
			if (i < pre.length - 1) {
				result.right = buildTree(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(in, i + 1, in.length));
			}
		}
		return result;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值