二进制树(非搜索)最大函数

Binary Tree (not search) max function

本文关键字:函数 搜索 二进制      更新时间:2023-10-16

我的代码出现了分段错误,我不知道为什么。我试图在一个没有排序的正则二叉树中找到最大值。

tnode<int> *maxT(tnode<int> *t)
{
if (t == NULL) return NULL; 
tnode<int> *left = maxT(t->left); 
tnode<int> *right = maxT(t->right); 
if (left->nodeValue > right->nodeValue)
{
return maxT(left);
}
if (left->nodeValue < right->nodeValue)
{
return maxT(right);
}
}

算法的基本原理相当简单。由于树是无序的,所有节点都必须访问,前提条件如下:

  • 一个null节点指针会导致null作为一个答案
  • 否则,没有子节点的节点将导致当前节点
  • 否则的结果是节点与其子节点的最大值相比的最大值

考虑到这一点,我很确定这就是你想要做的:

template<typename T>
tnode<T>* maxT(const tnode<T>* t)
{
if (!t)
return nullptr;
tnode<T>* lmax = maxT(t->left);
tnode<T>* rmax = maxT(t->right);
tnode<T>* cmax = (lmax && rmax) 
? ((rmax->nodeValue < lmax->nodeValue ? lmax : rmax))
: (lmax ? lmax : rmax);
return (!cmax || (cmax->nodeValue < t->nodeValue) ? t : cmax);
}
tnode<int> *maxT(tnode<int> *t)
{
if (t->right == NULL && t->left == NULL) //leaf node
return t->nodeValue;
else if (t->right == NULL) //no right subtree
return MAX(t->nodeValue, maxT(t->left))
else if (t->left == NULL) //no left subtree
return MAX(t->nodeValue, maxT(t->right))
else 
return MAX(maxT(t->right), maxT(t->left));
}

在您的情况下,如果一个节点没有右子节点或左子节点会发生什么。然后node->right==NULLnode->left==NULL。然而,您正在尝试访问左->节点值右->节点值