【问题标题】:What is leftmost & rightmost node of a binary subtree?二叉树的最左边和最右边的节点是什么?
【发布时间】:2017-12-24 23:05:03
【问题描述】:

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

即第二种方法不会像第一种方法所建议的那样返回最大价值请澄清..

【问题讨论】:

    标签: java data-structures binary-tree


    【解决方案1】:

    从您附加的链接来看,我假设您是在专门讨论二叉搜索树,它具有关于其节点组成的规则。

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

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

    因此,任何给定子树的最右边的孩子将始终是最高值。此外,任何给定子树的最左边的孩子将始终是最低值。

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

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

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

    假设我们试图在树中寻找最高的节点值。 如果我们从节点 9(“根”)开始,我们会继续向下遍历节点的每个右孩子,直到没有更多的右孩子(即从节点 9 开始,然后向下移动到节点 13,然后从节点 16 结束)。因此,16 是树中的最大值。

    与在树中搜索最低节点值类似,我们从树的根节点开始,不断向下遍历每个左子节点,直到不再存在左子节点。

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

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

    【讨论】:

      【解决方案2】:

      这个想法是使用水平顺序遍历。要找到第一个节点,我们使用变量 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);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-13
        • 1970-01-01
        相关资源
        最近更新 更多