在构建二叉树之前我们需要知道两个定理:第一个就是任何n(n>=0)个不同节点的二叉树,都可由它的中序序列和先序序列唯一确定;第二个就是任何n(n>=0)个不同节点的二叉树,都可由它的中序序列和后序序列唯一确定。(定理的证明可自行查阅资料)
现在我们就利用这两个定理来构建二叉树。
首先我们知道二叉树的先序序列是1234567,中序序列是3241657;下面看一下二叉树的构建过程:
代码如下:
public class TreeNode {
int val;
TreeNode left; //左节点
TreeNode right; //右节点
TreeNode(int x) { val = x; }
}
/**
* 递归构建二叉树
* @param pre 先序序列
* @param startPre 先序序列起点
* @param endPre 先序序列终点
* @param in 中序序列
* @param startIn 中序序列起点
* @param endIn 中序序列终点
* @return 二叉树根节点
*/
private static TreeNode reConstructBinaryTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn) {
if(startPre>endPre||startIn>endIn){
return null;
}
TreeNode root=new TreeNode(pre[startPre]);
for(int i=startIn;i<=endIn;i++){
if(in[i]==pre[startPre]){
root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
root.right=reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
}
}
return root;
}
利用中序序列:3241657和后序序列3426751构建二叉树过程如下:
代码如下:
/**
* 构建二叉树
* @param post 后序序列
* @param startPost 后序序列起点
* @param endPost 后序序列终点
* @param in 中序序列
* @param startIn 中序序列起点
* @param endIn 中序序列终点
* @return 二叉树根节点
*/
private static TreeNode reConstructBinaryTree(int [] post,int startPost,int endPost,int [] in,int startIn,int endIn) {
if(startPost>endPost||startIn>endIn){
return null;
}
TreeNode root=new TreeNode(post[endPost]);
for(int i=startIn;i<=endIn;i++){
if(in[i]==post[endPost]){
root.left=reConstructBinaryTree(post,startPost,i-startIn+startPost-1,in,startIn,i-1);
root.right=reConstructBinaryTree(post,i-startIn+startPost,endPost-1,in,i+1,endIn);
}
}
return root;
}