【问题标题】:Path of the diameter of a binary tree二叉树的直径路径
【发布时间】:2013-05-04 22:50:13
【问题描述】:

我有一个二叉树和一个最长路径大小(直径)的方法:

int diameter(struct node * tree)
{

   if (tree == 0)
     return 0;

  int lheight = height(tree->left);
  int rheight = height(tree->right);

  int ldiameter = diameter(tree->left);
  int rdiameter = diameter(tree->right);

  return max(lheight + rheight + 1, max(ldiameter, rdiameter));
} 

我希望该函数还返回确切的路径(直径的所有节点的列表)。 我该怎么做?

谢谢

【问题讨论】:

    标签: c++ c binary-tree


    【解决方案1】:

    您有两个选择: A) 思考。 B) 搜索。在最初的几个谷歌点击中,你可以找到这个:http://login2win.blogspot.hu/2012/07/print-longest-path-in-binary-tree.html

    如果您想学习,请选择 A),如果您不关心,请选择 B),只想要一个快速但不一定完美的解决方案。

    有很多可能的解决方案,其中一些:

    1. 在分而治之的方法中,您最终可能会在两边保持迄今为止最长的路径,而只保留更长的路径。
    2. 引用的解决方案执行两次遍历,一次用于确定直径,第二次用于打印。这是一个很好的技巧,可以克服不知道我们是否处于方法 1 的最深点的问题。
    3. 不是深度优先搜索,而是广度优先搜索。使用队列。对于存储父节点的每个节点,逐级进行。当您到达最后一级(没有子节点添加到队列中)时,您可以轻松打印整个路径,因为最后打印的节点位于(一个)最长路径上,并且您拥有父链接。

    【讨论】:

      【解决方案2】:

      将属性struct node * next 添加到节点结构。在 return 语句之前,添加这样一行 tree->next = (ldiameter > rdiameter ? tree->left : tree->right) 以获得较长的路径节点作为下一个节点。调用diameter(root) 后,您应该能够从根开始遍历所有下一个节点以打印最大路径。

      【讨论】:

        【解决方案3】:

        我认为以下可能有效...在 O(N) 时间内按如下方式计算直径。

        // this is a c++ code
        int findDiameter(node *root, int &max_length, node* &max_dia_node, int parent[], node* parent_of_root){
            if(!root) return 0;
            parent[root->val] = parent_of_root->val;
            int left = findDiameter(root->left, max_length);
            int right = findDiameter(root->right, max_length);
            if(left+right+1 > max_length){
                max_dia_node = root;
                max_length = left+right+1;
            }
            return 1 + max(left,right);
        }
        

        所以在这个函数中发生了很多事情。首先 max_length 正在计算树的最大直径。与此同时,我将 max_dia_node 分配给该节点。

        这是我的最大直径要通过的节点。

        现在使用这个信息我们可以找到这个节点的最大深度左孩子和右孩子(max_dia_node)。从那里我们可以通过“父”数组获得实际的节点。

        这是对树的两次遍历。

        【讨论】:

          猜你喜欢
          • 2019-08-12
          • 1970-01-01
          • 1970-01-01
          • 2016-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-16
          相关资源
          最近更新 更多