我认为最让你困惑的是..
return(tree_size(node->left) + tree_size(node->right) + 1);
如果您在顶部节点上调用此函数,它会告诉您树中的节点数是左侧的节点数加上右侧的数,再加上您刚刚调用函数的节点上的 this。
现在,我不认为是递归让您感到困惑,如果是,请发表评论,我可以再解释一下。
我认为您遇到的问题是该行的执行顺序。好吧,它遵循“加法”的逻辑数学规则。注意,我们知道我们不必关心运算符重载,就像tree_size
返回 an一样int
,所以我们有
intA + intB + intC;
我相信我不需要告诉你添加这三个值的顺序无关紧要,你会得到相同的结果。
但是,这些添加的顺序是明确定义的。如果您将+
运算符视为它的功能,它会更清晰一些。我们基本上有(我希望我做对了):
operator+(intA , operator+( intB, intC);
所以,你可以看到,我们需要先计算 B + C,然后才能加 A,或者如果我们把它带回到有问题的代码行,我们tree_size
首先得到右边的,加一个,然后加在tree_size
左边。这是需要注意的重要事项,您可以做一些非常奇怪的事情,例如在获得值时编辑树大小......例如,如果您将节点从一侧移动到另一侧。当然,如果获取它的大小不是您可以依赖的东西,那将是一棵非常糟糕的树。
我担心我可能在这里做得太多了,所以如果我有点错过了标记,请发表评论,我很乐意帮助您改善这个答案。