重建二叉树
2016-03-03 20:15
429 查看
题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列[ 1, 2, 4, 7, 3, 5, 6,8 ]
, 中序遍历序列 [4, 7, 2, 1 , 5, 3, 8, 6 ]。 重建二叉树并输入它的头结点。
二叉树为
前序遍历序列的第一个数字就是根节点的值。扫描中序遍历序列,就能确定根节点的值的位置。根据中序遍历特点,在根结点前是左子树结点的值,根结点后面是右子树结点的值。此时,找到了左右子树对应的前序,中序序列。再用同样的方法去构建左右子树,接下来就可以用递归完成
Java
代码如下:
packageoffer;
public classRebuildBinaryTree {
publicstatic void main(String[] args) {
// BinaryTreeNodenode1 = new BinaryTreeNode(1);
// BinaryTreeNodenode2 = new BinaryTreeNode(2);
// BinaryTreeNodenode3 = new BinaryTreeNode(3);
// node1.left= node2;
// node1.right= node3;
// node1.preOrder(node1);
int[]preOrder = {1,2,3,4};
int[]inOrder = {1,2,3,4};
BinaryTreeNoderoot = rebuildBinaryTree(preOrder,inOrder);
root.preOrder(root);
System.out.println();
root.inOrder(root);
}
publicstatic BinaryTreeNode rebuildBinaryTree(int[] preOrder, int[] inOrder) {
if(preOrder == null || inOrder == null)
returnnull;
BinaryTreeNoderoot = null;
root= construct(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
returnroot;
}
privatestatic BinaryTreeNode construct(int[] preOrder, int preStart, int preEnd, int[]inOrder, int inStart,
intinEnd) {
if(preStart>preEnd|| inStart>inEnd)return null;
BinaryTreeNoderoot = null;
introotValue = preOrder[preStart];
root= new BinaryTreeNode(rootValue);
root.left= root.right = null;
introotIndex = inStart;
while(rootIndex <= inEnd && inOrder[rootIndex] != rootValue) {
rootIndex++;
}
if(rootIndex > inEnd)
returnnull;
intleftLength = rootIndex - inStart;
root.left=
construct(preOrder,preStart + 1, preStart + leftLength, inOrder, inStart, rootIndex - 1);
root.right=
construct(preOrder,preStart + leftLength + 1, preEnd, inOrder, rootIndex + 1, inEnd);
returnroot;
}
}
class BinaryTreeNode{
intval;
BinaryTreeNodeleft;
BinaryTreeNoderight;
BinaryTreeNode(intval) {
this.val= val;
}
publicString toString() {
returnthis.val + "";
}
publicvoid preOrder(BinaryTreeNode root) {
if(root != null) {
System.out.print(root.val+ " ");
preOrder(root.left);
preOrder(root.right);
}
}
publicvoid inOrder(BinaryTreeNode root) {
if(root != null) {
inOrder(root.left);
System.out.print(root.val+ " ");
inOrder(root.right);
}
}
}
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列[ 1, 2, 4, 7, 3, 5, 6,8 ]
, 中序遍历序列 [4, 7, 2, 1 , 5, 3, 8, 6 ]。 重建二叉树并输入它的头结点。
二叉树为
前序遍历序列的第一个数字就是根节点的值。扫描中序遍历序列,就能确定根节点的值的位置。根据中序遍历特点,在根结点前是左子树结点的值,根结点后面是右子树结点的值。此时,找到了左右子树对应的前序,中序序列。再用同样的方法去构建左右子树,接下来就可以用递归完成
Java
代码如下:
packageoffer;
public classRebuildBinaryTree {
publicstatic void main(String[] args) {
// BinaryTreeNodenode1 = new BinaryTreeNode(1);
// BinaryTreeNodenode2 = new BinaryTreeNode(2);
// BinaryTreeNodenode3 = new BinaryTreeNode(3);
// node1.left= node2;
// node1.right= node3;
// node1.preOrder(node1);
int[]preOrder = {1,2,3,4};
int[]inOrder = {1,2,3,4};
BinaryTreeNoderoot = rebuildBinaryTree(preOrder,inOrder);
root.preOrder(root);
System.out.println();
root.inOrder(root);
}
publicstatic BinaryTreeNode rebuildBinaryTree(int[] preOrder, int[] inOrder) {
if(preOrder == null || inOrder == null)
returnnull;
BinaryTreeNoderoot = null;
root= construct(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
returnroot;
}
privatestatic BinaryTreeNode construct(int[] preOrder, int preStart, int preEnd, int[]inOrder, int inStart,
intinEnd) {
if(preStart>preEnd|| inStart>inEnd)return null;
BinaryTreeNoderoot = null;
introotValue = preOrder[preStart];
root= new BinaryTreeNode(rootValue);
root.left= root.right = null;
introotIndex = inStart;
while(rootIndex <= inEnd && inOrder[rootIndex] != rootValue) {
rootIndex++;
}
if(rootIndex > inEnd)
returnnull;
intleftLength = rootIndex - inStart;
root.left=
construct(preOrder,preStart + 1, preStart + leftLength, inOrder, inStart, rootIndex - 1);
root.right=
construct(preOrder,preStart + leftLength + 1, preEnd, inOrder, rootIndex + 1, inEnd);
returnroot;
}
}
class BinaryTreeNode{
intval;
BinaryTreeNodeleft;
BinaryTreeNoderight;
BinaryTreeNode(intval) {
this.val= val;
}
publicString toString() {
returnthis.val + "";
}
publicvoid preOrder(BinaryTreeNode root) {
if(root != null) {
System.out.print(root.val+ " ");
preOrder(root.left);
preOrder(root.right);
}
}
publicvoid inOrder(BinaryTreeNode root) {
if(root != null) {
inOrder(root.left);
System.out.print(root.val+ " ");
inOrder(root.right);
}
}
}
相关文章推荐
- Java虚拟机的相关解释
- fzu2087 统计树边 最小生成树应用
- git 仓库转移
- 字符串匹配算法 朴素算法 Rabin—Karp算法,KMP算法
- 00004笔试题
- 自定义三叉树
- Ajax
- BZOJ 4412/Usaco2016 Feb Circular Barn(构造)
- 37. Sudoku Solver
- question_015-JAVA之Map的遍历方式
- Eigen矩阵运算
- Windows系统软件
- maven
- 29-题目1101:计算表达式
- NLTK学习笔记——开篇
- ID3算法
- leetcode题目总结(转)
- 1066. Root of AVL Tree (25)
- 免费天气预报接口
- String以及StringBuffer相关应用讲解