构建二叉树(java)

在构建二叉树之前我们需要知道两个定理:第一个就是任何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;
 }

猜你喜欢

转载自blog.csdn.net/luqiren/article/details/78510163