您的位置:首页 > Web前端

算法第二周作业02

2017-03-01 21:58 176 查看


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息