墨歆洹 2021-11-23 22:55 采纳率: 66.7%
浏览 20
已结题

中序遍历和先序遍历 创建二叉树,如下代码中,参数preEnd要传入:preStart+i-inStart,这个为什么要减inStart

递归左子树,参数preEnd要传入:preStart+i-inStart,这个为什么要减inStart
递归右子树参数preStart要传入:preStart+i-inStart+1,这个为什么要减inStart


private static TreeNode reConstructBinaryTree(int[] pre,int preStart,int preEnd,int[] in,int inStart,int inEnd){
        if(preStart>preEnd || inStart > inEnd){ 
            return null;
        }
        TreeNode  treeNode =new TreeNode(pre[preStart]);
        for(int i=inStart;i<=inEnd;i++){
            if(in[i] == pre[preStart]){ 
                treeNode.lchild = reConstructBinaryTree( pre,preStart+1,preStart+i-inStart,in,inStart,i-1);
                treeNode.rchild = reConstructBinaryTree(pre,preStart+i-inStart+1,preEnd,in,i+1,inEnd);
            }
        }
        return treeNode;
    }
  • 写回答

1条回答 默认 最新

  • 钰娘娘 2021-11-25 17:54
    关注

    随便举个例子就可以了:
    前序:1 2 3 4 5
    中序:2 3 1 4 5

    前序可以定根,当前范围的第一个是根,但是不知道后续左子树右子树的长度
    初始状态:
    preStart=0,preEnd=4,inStart=0,inEnd=4

    从前序中找到根是1,然后在中序0到4索引范围,找到索引2的值是2,于是对于中序数组,我们知道(0,1)是左子树(2,3)是右子树,其中,左子树的范围是2个元素,
    那么可以把前序的接下来两个元素,考虑为前序的左子树,其余为右子树,
    表达起来就是:

    int len = i-inStart+1; //i为找到的索引2,左子树长度
    int nextLeftPreEnd = (preStart+1)+( i-inStart+1);//起点+长度-1=终点,等价于prevStart+i-inStart;
    int nextRightPreStart = nextLeftPreEnd+1;//其实题目那么写有点迷茫了,前序顺序就是【根,左子树,右子树】,所以排除掉左,紧接着后续就是右
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月3日
  • 已采纳回答 11月25日
  • 创建了问题 11月23日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog