重建二叉树.2

Q:根据前序遍历和后续遍历序列可以唯一确定一颗二叉树吗?
A:先序遍历和后序遍历为什么不能唯一地确定一棵树?
结论是:如果树中所有结点的度为0或者2,则可以唯一还原。
当一个结点只有一个子结点(非空)时,则不能唯一还原。

static class Node
    {
        public int data;
        public Node left;
        public Node right;
    }
    public static Node create(int[] preArr,int[] postArr)
    {
        if (preArr==null||postArr==null||preArr.length==0||postArr.length==0)
        {
            return null;
        }
        return createHelper(preArr,0,preArr.length-1,postArr,0,postArr.length-1);
    }
    public static Node 
        createHelper(int[] preArr,int preStart,int preEnd,int[] postArr,int postStart,int postEnd)
    {
        if (preArr[preStart]!=postArr[postEnd])
        {
            throw new RuntimeException("Invalid input");
        }
        Node root=new Node();
        //根节点就是前序遍历中开头的节点
        root.data=preArr[preStart];
        if (preStart==preEnd)
        {
            if (postStart==postEnd)
            {
                return root;
            }
            else
            {
                throw new RuntimeException("input valid");
            }
        }
        //说明根节点度为1,只有一个孩子节点,这时无法唯一确定这颗二叉树
        if (preArr[preStart+1]==postArr[postEnd-1])
        {
            throw new RuntimeException("Can't determine the tree");
        }
        //例如前序为:ABDECFG,后序为DEBFGCA
        //A肯定是根节点,然后B是左孩子节点,C是右孩子节点
        //先找到C在前序遍历序列中的位置:A BDE CFG
        //则BDE就是A的左子树,CFG就是A的右子树
        //同样在后序遍历序列中:DEB FGC A
        //则DEB就是A的左子树,FGC就是A的右子树
        //*********************************************************
        //找到前序遍历序列中右子结点的位置
        int temp=preStart;
        while (temp<=preEnd&&preArr[temp]!=postArr[postEnd-1])
        {
            temp++;
        }
        if (temp>preEnd)
        {
            throw new RuntimeException("input valid");
        }
        int leftLen=temp-preStart-1;
        if (leftLen>0)
        {
            root.left=createHelper(preArr,preStart+1,temp-1,postArr,postStart,postStart+leftLen-1);
        }
        if (leftLen<postEnd-postStart)
        {
            root.right=createHelper(preArr,temp,preEnd,postArr,postStart+leftLen,postEnd-1);
        }
            return root;
    }
    public static void main(String[] args) 
    {
        //int[] preArr={1,2,4,6,7,5,3};
        //int[] midArr={6,7,4,5,2,3,1};
        int[] preArr={1,2,4,5,3,6,7};
        int[] midArr={4,5,2,6,7,3,1};
        Node t=create(preArr,midArr);
        preOrder(t);
        System.out.println();
        midOrder(t);
        System.out.println();
        postOrder(t);
        System.out.println();
        doubleStackPostOrder(t);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,534评论 0 14
  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 1,598评论 0 7
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,394评论 0 25
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,833评论 0 19
  • 树和二叉树 1、树的定义 树(Tree)是由一个 或 多个结点 组成的有限集合T,且满足: ①有且仅有一个称为根的...
    利伊奥克儿阅读 1,401评论 0 1