我正在this阅读并在一个地方说
最右边的节点将是左子树中具有最大值的节点,我假设最左边的节点是右子树中最大的值。
然而,在another article中,它向我展示了一种找到最左边节点的不同方法:
1)如果给定节点没有正确的孩子:
转到给定节点的根,直到它是任何节点的左子节点。该节点将成为树中的下一个更高节点。
2)如果给定节点有正确的孩子:
a)如果给定节点的右子女没有左子女
The right child will be the next higher node.
b)如果给定节点的右子女已离开孩子
The leftmost leaf node will be the next higher node.
即第二种方法没有返回最大值,因为第一种方法建议请澄清..
答案 0 :(得分:1)
根据您附加的链接判断,我假设您专门讨论二进制搜索树,其中包含有关其节点组成的规则。
作为二叉树的一般规则(以及扩展,子树):
因此,任何给定子树的最右边的子项将始终是最高值。此外,任何给定子树的最左边的子项将始终是最低值。
请记住,二叉树与二叉树搜索树略有不同,这些规则不一定适用于二叉树。
让我们使用以下二叉搜索树作为示例:
9
/ \
4 13
/ \ / \
1 5 11 16
假设我们正在尝试在树中查找最高节点值。 如果我们从节点9(" root")开始,我们继续遍历节点的每个右子节点,直到没有更多正确的子节点(即从节点9开始,然后向下移动到节点13,并且然后结束节点16)。因此,16是树中的最高值。
与搜索树中的最低节点值类似,我们从树的根节点开始,并继续遍历每个左子节点,直到不再有左子节点。
资料来源:在我的大学数据结构和算法课程(IT学生)中了解到这一点
希望这会有所帮助,请随时纠正我可能犯过的任何错误(我是新来的)。
答案 1 :(得分:-1)
这个想法是使用Level Order Traversal。要查找第一个节点,我们使用变量isFirst。为了分离级别,我们在每个级别之后将NULL排入队列。所以在级别顺序遍历中,如果我们看到NULL,我们知道下一个节点将是其级别的第一个节点,因此我们设置isFirst。
void printCorner(Node *root)
{
queue<Node *> q;
q.push(root);
q.push(NULL);
bool isFirst=false;
bool isOne = false;
int last;
Node *temp;
while(!q.empty()){
temp = q.front();
q.pop();
if(isFirst){
cout<<temp->key<<" ";
if(temp->left)q.push(temp->left);
if(temp->right)q.push(temp->right);
isFirst = false;
isOne = true;
}
else if(temp==NULL){
if(q.size()>=1)q.push(NULL);
isFirst = true;
if(!isOne)cout<<last<<" ";
}
else{
last = temp->key;
isOne = false;
if(temp->left)q.push(temp->left);
if(temp->right)q.push(temp->right);
}
}
}