路径中的最大左节点/子节点数

时间:2018-07-29 02:43:41

标签: c++ binary-search-tree

我正在尝试找到一种方法来输出在路径中找到的最左节点的数量。 例如:BST Example

此二叉搜索树中的最大节点数为2(从5-> 3-> 1开始,不包括根)。

解决此问题的最佳方法是什么?


我已经看到了这个线程,它与我试图实现的线程非常相似。

Count number of left nodes in BST

但是我不理解的代码中只有一行。

count += countLeftNodes(overallRoot.left, count++); 
  

overallRoot.left

我的猜测是它在对象上调用了一个函数,但是我无法弄清楚该函数中包含什么以及返回什么。

对这两个问题的任何回答将不胜感激。

2 个答案:

答案 0 :(得分:2)

您链接的答案显示了如何遍历树,但是您需要一种不同的算法来获取计数,因为正如您已经指出的那样,该问题正在尝试解决稍有不同的问题。

在遍历的任何给定点,您将拥有当前的剩余计数:它将作为第二个参数向下传递到树上, col1 col2 col3 0 a False a 1 b False a 2 c True a 3 d False c 4 e True c 5 f False e 。该值从根部的零开始,并在您进入节点的左子节点时增加一,但在进入右节点时被设置为零。

然后对于左右遍历,将左计数设置为其当前值中的较大者,然后从递归调用返回到countLeftNodes()。然后,这个最终值就是您从countLeftNodes()返回的值

答案 1 :(得分:2)

以下是@dgnuff算法的镜头:

void maxLeftNodesInPath(Node *root, int count, int *best) {
    if (root) {
        maxLeftNodesInPath(root->left, ++count, best);
        maxLeftNodesInPath(root->right, 0, best);
    }
    else if (count > *best) {
        *best = count - 1;
    }
}

解释几乎相同:向左移动时不断积累计数,向右移动时重置,如果有叶子,则更​​新最佳。

这里是repl