您的位置:首页 > 其它

重建二叉树

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);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: