使用C在搜索二叉树中查找最长路径

Posted

技术标签:

【中文标题】使用C在搜索二叉树中查找最长路径【英文标题】:Find longest path in a search binary tree using C 【发布时间】:2022-01-16 01:24:40 【问题描述】:

我无法找到使用递归函数查找搜索二叉树最长路径的代码。

void maxDepth(bst_node *node)
            ....

bst_node 是搜索二叉树的一个节点。

退出递归的条件很简单:

if(node->leftChild==NULL&&node->rightChild==NULL)

return;

在进行递归之前打印节点的值:

printf("%d ",node->value);

如果假设深度 x 的节点只有一个左孩子,那么最长的路径会通过该节点的左孩子,通过使用递归我们可以这样写:

if(node->rightChld==NULL)
     
maxDepth(node->leftChild);

如果深度 x 的节点只有一个右孩子,那么最长的路径会通过该节点的右孩子,通过使用递归我们可以这样写

if(node->leftChild==NULL)

maxDepth(node->rightChild);


但是如果节点同时具有左右孩子怎么办?我不明白我该怎么做。

例如,对于这个二叉搜索树,输出应该是:

“11 13 57 25 17”

帮助表示赞赏。

【问题讨论】:

两者都做,看看哪个更好。 如何查看哪个更好? maxDepth 函数需要将其发现报告给调用者。这通常通过返回深度来完成。也就是说,函数是int maxDepth(bst_node *node) 为什么你的函数是void 函数?调用该函数的假定效果是什么?你能给出函数应该给出的示例输入和相应的输出,以及它应该如何给出? (不是返回值??) 我已经更新了问题。 【参考方案1】:
#define max(a, b) a > b ? a : b
int maxDepth(bst_node *node) 
    if (node == NULL) 
        return 0;
    
    int max_left = maxDepth(node->leftChild);
    int max_right = maxDepth(node->rightChild);
    return max(max_left, max_right) + 1;

【讨论】:

想清楚。这总是返回零。【参考方案2】:

诀窍是仔细考虑每种可能的情况。要么是基本情况,要么您需要将其分解为可以通过递归调用解决的较小问题。

int max(int a, int b)  return a > b ? a : b; 

int maxDepth(bst_node *node)

  // If the tree is empty, the depth is zero.
  if (!node) return 0;

  // Otherwise it's this node plus the max of the children.
  return 1 + max(maxDepth(node->leftChild), maxDepth(node->rightChild));

【讨论】:

以上是关于使用C在搜索二叉树中查找最长路径的主要内容,如果未能解决你的问题,请参考以下文章

hiho #1050 : 树中的最长路 树的直径

二叉树的最长交错路径

编写c++算法求任意二叉树中一条最长的路径,并输出此路径上各结点的值

549. 二叉树中最长的连续序列

数据结构与算法之深入解析“二叉树中的最长交错路径”的求解思路与算法示例

题解报告:hihoCoder #1050 : 树中的最长路