【问题标题】:Ambiguity with the Top View of a binary tree二叉树顶视图的歧义
【发布时间】:2020-04-22 18:04:20
【问题描述】:

二叉树的顶视图到底是什么?

我发现我发现的文章非常含糊不清。

例如,这是用于演示geeksforgeeks 的顶视图:

       1
    /     \
   2       3
  /  \    / \
 4    5  6   7

他们接着说顶视图是 4 2 1 3 7。这里的问题是他们留下了很多关于什么不是顶视图的猜测。因此,在代码中实现变得模棱两可。

Stackoverflow 到目前为止的例子并没有更好。 Hackerrank 的例子更糟糕。

所以我希望有人能明确地告诉我顶视图是什么,因为我已经尝试了 2 天。例如,这棵树的顶视图是什么:

      1
       \
        14
       /  \
      3    15
     / \
    2   7
       /  \
      4     13
     / \   /
    5   6 10
         /  \
        8    11
         \    \
          9    12

如果我可以大胆地问,为什么它很重要?

【问题讨论】:

    标签: data-structures binary-tree


    【解决方案1】:

    现在要了解顶视图的定义,最好的方法是知道如何找到树的顶视图。

    查找顶视图是两种遍历的组合,即-> Level Order Traversal 和 Vertical Traversal(也有其他方法,但这是最基本的一种)。

    为了可视化这一点,开始在树中绘制垂直线,在您的第二个示例中,将绘制 6 条垂直线覆盖节点,1st -> 2,5 ||第二 -> 1,3,4 ||第三 -> 14,7,6,8 ||第 4 -> 15,13,​​10,9 ||第 5 -> 11 ||第 6 -> 12。 现在遍历这些垂直线的引线,这将给出树 2->1->14->15->11->12 的顶视图。

    这就像你一直盯着树的顶部开始画直线,直线在接触任何其他节点之前首先切割的节点是树的顶视图。

    就像关于hackerrank的所有其他问题有助于加强你的基本概念一样,查找顶视图有助于你详细了解水平顺序遍历和垂直遍历概念。

    【讨论】:

      【解决方案2】:

      为了回答你的问题,我会要求你假设一个粗略的草图,以实际理解问题顶视图所要求的。您可能会假设您正在从上面的直升机上以 二叉树的根 作为 树的顶峰 观察这棵树。

      假设根的秩为0。您需要按级别顺序遍历树。如果您向 向左移动,当前排名会降低 1,如果向 向右移动,当前排名会增加 1。然后,您将能够看到每个等级唯一值作为输出。 rank实际上是root node中的horizontal distance

      就像第一个例子:

                   ------- 1 (0) -------
                  /                     \
              2 (0-1=-1)               3 (0+1=1)
            /           \             /          \
         4 (-1-1=-2)  5 (-1+1=0)    6 (1-1=0)   7 (1+1=2)
      

      在括号中我写下了我所指的排名。 因此,如果按照 GeeksForGeeks 中的要求从从左到右编写最终输出,您可以打印根据排名排序的每个唯一排名的相应数字。

      我想现在很清楚为什么 5 (rank=0) 和 6(rank=0) 不在最终答案中。因为当从树的顶部看到时,这些数字将被 1(rank=0)遮蔽。

      map<int,int> mp;
      
      void topView(Node * root) {
          if(!root)
              return;
      
          mp.insert({0,root->data});
      
          queue<pair<Node*,int>> q;
          q.push({root,0});
          while(!q.empty()){
              Node *tmp=q.front().first;
              int dis=q.front().second;
              q.pop();
      
              if(tmp->left){
                  q.push({tmp->left,dis-1});
      
                  if(mp.find(dis-1)==mp.end()){
                      mp.insert({dis-1,tmp->left->data});
                  }
              }
      
              if(tmp->right){
                  q.push({tmp->right,dis+1});
      
                  if(mp.find(dis+1)==mp.end()){
                      mp.insert({dis+1,tmp->right->data});
                  }
              }
          }
      
          for(auto i : mp){
              cout<<i.second<<" ";
          }
      
      }
      

      上述问题的公认解决方案。 链接:很好解释!请参阅分步说明。 https://stackoverflow.com/a/31388101/13962659

      【讨论】:

        【解决方案3】:

        我不知道您的技术或数学定义,但从链接中可以看出树的顶视图如下:

        想象你的树放在桌子的表面上。从桌子的根端沿着桌子的长度向下看。假设节点的值写在小木块上,它们之间的链接用木块表示,木块的高度足以掩盖它们后面的任何节点,当你把头低到桌子高度时,你能看到哪些节点?在第一个示例中,5 和 6 是模糊的,而 2、3、4 和 7 向左或向右向外延伸,因此它们仍然可见。

        但是,正如您的第二个示例所示,这对于节点 2、5、11、12、13 是否向外延伸到足以可见的距离是模棱两可的。

        这似乎是一个定义不明确的概念,这可能意味着它不值得担心。

        【讨论】:

          猜你喜欢
          • 2021-09-12
          • 1970-01-01
          • 1970-01-01
          • 2022-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-02
          相关资源
          最近更新 更多