我调试过程中发现,课程中线段树的树形图示与实际代码可能不相符

来源:9-7 更多线段树相关的话题

慕粉3458977

2020-05-01

如下图中,最底层叶子节点总是靠右的,而代码跑出来的结果却总是靠左。
以节点A[5…9]为例,mid = 7,从代码来看,左分支节点应该为A[5…7],右分支节点应该为A[8…9];
同时,我们不可以把代码改为buildSegmentTree(leftTreeIndex, l, mid - 1);因为mid是可能为0的;
所以我认为,当节点的区间元素数量为奇数时,左子树应该涵盖更大的区间,而右子树偏少,所以整棵树的最底层叶子节点应该是靠左的。

不知道我想的对不对…

private void buildSegmentTree(int treeIndex, int l, int r){

        if(l == r){
            tree[treeIndex] = data[l];
            return;
        }

        int leftTreeIndex = leftChild(treeIndex);
        int rightTreeIndex = rightChild(treeIndex);

        // int mid = (l + r) / 2;
        int mid = l + (r - l) / 2;
        buildSegmentTree(leftTreeIndex, l, mid);
        buildSegmentTree(rightTreeIndex, mid + 1, r);

        tree[treeIndex] = merger.merge(tree[leftTreeIndex], tree[rightTreeIndex]);
    }

图片描述

写回答

1回答

liuyubobobo

2020-05-01

你是的对的。代码中我的 mid 的计算方式实际上是下取整,并且左边包含 mid,所以在奇数的情况下,左边的节点会多。


虽然这个图也是线段树,但确实没有准确反映课程代码对应的线段树。抱歉!


继续加油!:)

0
3
liuyubobobo
回复
慕粉3458977
这个问题太大了,而且如你所说,和具体的创业方向关系特别大,也和具体是做业务创业还是技术创业有关。我的经验是大多数技术人员普遍缺少的是对市场和运营的理解。如果团队人数超过5个,并且你是主导的话,大多数技术人员也需要加强基本的管理学训练。但不管怎么说,我觉得第一步还是找到一个创业的方向,并且有一个初步的尝试。很多时候创业史走一步看一步的,很难提前准备好。做更重要。不过现在的形式,整体我是不建议创业的,特别不建议辞职创业。
2020-05-01
共3条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程