什么是最左边的&二进制子树的最右边节点?

时间:2015-11-01 02:59:15

标签: java data-structures binary-tree

我正在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.

即第二种方法没有返回最大值,因为第一种方法建议请澄清..

2 个答案:

答案 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);
        }
    }
}