二叉子树的最左边和最右边的节点是什么?

What is leftmost & rightmost node of a binary subtree?

我正在阅读 this 并且在一个地方它说

最右边的节点将是左子树中具有最大值的节点,我假设最左边是右子树中的最大值。

但是,在 another article 中,它向我展示了一种查找最左边节点的不同方法:

1) 如果给定的节点没有权限 child :

转到给定节点的根,直到它是任何节点的左侧 child。该节点将是树中的下一个更高节点。

2) 如果给定的节点有权利 child :

a) 如果给定节点的右边child没有左边child

The right child will be the next higher node.

b) 如果给定节点的右边child已经离开child

The leftmost leaf node will be the next higher node.

即第二种方法没有return第一种方法建议的最大价值请澄清..

根据您所附的 link 判断,我假设您是在专门谈论二叉搜索树,它有关于其节点 make-up 的规则。

作为二叉树(以及子树)的一般规则:

  • 节点右侧的每个 child 都将大于该节点。
  • 节点左侧的每个 child 都将小于该节点。

因此,任何给定 sub-tree 的 right-most child 将始终是最高值。此外,任何给定 sub-tree 的 left-most child 将始终是最低值。

请记住,二叉树与二叉搜索树略有不同,这些规则不一定适用于二叉树。

我们以下面的二叉搜索树为例:

        9
      /   \
     4     13
   /  \   /  \
  1   5  11  16

假设我们正在尝试寻找树中的最高节点值。 如果我们从节点 9("root")开始,我们继续向下遍历节点的每个右 child,直到没有更多的右 children(即从节点 9 开始,然后移动向下到节点 13,然后结束节点 16)。因此,16 是树中的最高值。

与在树中搜索最低节点值类似,我们从树的根节点开始,一直向下遍历每个左边 child 直到没有更多的左边 children 存在。

来源:我在大学的数据结构和算法课程中学到的(IT 学生)

希望这对您有所帮助,请随时纠正我可能犯的任何错误(我是新来的)。

想法是使用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);
        }
    }
}