算法第二周作业02
2017-03-01 21:58
176 查看
Description
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。某颗树的先序遍历: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;
}
相关文章推荐
- 算法第二周作业05
- 算法第二周作业06
- 第二周作业--------判断一个正整数是否为质数的算法
- 算法 第二周作业
- 第二周算法作业
- 第二周作业02 -- 随机生成一个n位的二进制数对应的长整数
- 第二周的算法作业
- 算法第四周作业02
- 程序设计与算法(一)C语言程序设计CAP 第二周编程作业
- 第二周作业:“RSA”、“数字签名”、“公钥”、“DES“的解释; 判断一个正整数是否为质数的算法;随机生成一个n bit位的长整数
- 算法第二周作业:名词解释
- 判断一个正整数是否为质数的算法(第二周作业2.1)
- 算法设计与应用基础作业第二周
- 算法概论第二周作业
- 算法作业_3(2017.2.27第二周)
- 算法作业_2(2017.3.2第二周)
- 算法第十三周作业02
- 第二周作业1——判断一个正整数是否为质数的算法
- 第二周作业---判断一个正整数是否为质数的算法
- 第二周作业 2.1: 判断一个正整数是否为质数的算法