现在我是二叉树,我想从中获取最大值。考虑它如何同时具有字符串和int值,它按字母顺序排序。一切都正常工作所有插入,搜索,删除等。现在我们需要知道的是,这里有我的树。
typedef struct node
{
char *name;
int count;
struct node *l, *r;
}*link;
如何创建一个简单的函数来查找树中最高count
的内容。就像我在树中可以有20个节点并假设最高count
是10并且有3个节点具有最高count
。 10个最高count
的数量并不重要,我只想让函数返回10.函数就像。
int maxValue(link head)
{
//the help i need with
}
我在网上查了一下,尝试了一些例子,例如inorder和所有不同的功能,但大多数只是将所有值从左节点放到最右边的那个,所以它并没有真正帮助我找到树中的最大数量,因为我的数字从最小到最大都没有。
答案 0 :(得分:1)
递归是你的朋友。您的函数会比较自身的值,左侧的最大值和右侧的最大值,并返回最大值。
int maxValue(link head)
{
if(head == NULL){
return -1;
}
int me = head->count;
int l = maxValue(head->l);
int r = maxValue(head->r);
if(me >= l && me >= r) {
return me;
} else if(l >= me && l >= r){
return l;
} else {
return r;
}
}
<强>备注强>
这段代码并不像人们写的那样通用。如果count
在树中始终大于等于零并且如果在开始时没有在NULL对象上调用该函数,那么它将仅按预期工作,因为那时将返回-1
。在实践中更好地使用@blazs解决方案。
答案 1 :(得分:1)
我们的想法是首先计算给定节点的子树maxLeft
和maxRight
的最大值,然后返回max(currVal, maxLeft, maxRight)
,其中currVal
是当前节点中的值。
以下是您在代码中直接表达的方式:
int maxValue(link head)
{
assert(head != NULL);
int currVal = head->count;
if (head->l != NULL) // compute max of the left subtree
currVal = max(currVal, maxValue(head->l));
if (head->r != NULL) // compute max of the right subtree
currVal = max(currVal, maxValue(head->r));
return currVal;
}
max
可以是一个简单的宏,例如
#define max(x, y) (x) > (y) ? (x) : (y)
答案 2 :(得分:0)
要在树中查找最大值,代码无法利用字母顺序。相反,需要走完整棵树。这包括检查当前节点,然后检查左右两个孩子中每个孩子的最大值。
走二叉树的一个经典改进是只回到一条腿(例如左侧)并循环另一条腿(右侧)。这个循环展开有时可以通过双腿递归的智能编译器来识别。在下面,它是明确完成的。
如果原始INT_MIN
。
head == NULL
int maxValue(link head) {
int max = INT_MIN;
while (head) {
if (head.count > max) {
max = head.count;
}
int left_max = maxValue(head.left);
if (left_max > max) {
max = left_max;
}
head = head.right;
}
return max;
}
样式:我宁愿看到没有*
的typedef,如下所示。
typedef struct node {
char *name;
int count;
struct node *l, *r;
} link;