使用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在搜索二叉树中查找最长路径的主要内容,如果未能解决你的问题,请参考以下文章
编写c++算法求任意二叉树中一条最长的路径,并输出此路径上各结点的值