Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二叉树直径的路径_C++_C_Binary Tree - Fatal编程技术网

C++ 二叉树直径的路径

C++ 二叉树直径的路径,c++,c,binary-tree,C++,C,Binary Tree,我有一个二叉树和一个计算最长路径(直径)大小的方法: 我希望函数也返回确切的路径(直径的所有节点的列表)。 我怎么做 谢谢你有两个选择: A) 想想看。 B) 搜索。在最初几次谷歌点击中,您可以找到以下内容: 选择A)如果你想学习,选择B)如果你不在乎,只想要一个快速但不一定完美的解决方案 有许多可能的解决方案,其中一些: 在分而治之的方法中,您可能最终会在两侧保留到目前为止最长的路径,而只保留较长的路径 引用的解决方案执行两次遍历,一次用于确定直径,另一次用于打印。这是一个很好的技巧,可以克服

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

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

谢谢你有两个选择: A) 想想看。 B) 搜索。在最初几次谷歌点击中,您可以找到以下内容:

选择A)如果你想学习,选择B)如果你不在乎,只想要一个快速但不一定完美的解决方案

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

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

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

    我认为以下方法可能有效。。。按O(N)时间计算直径,如下所示

    在这个函数中,发生了很多事情。第一个最大长度是计算树的最大直径。同时,我将最大直径节点分配给这个节点

    这是我将使最大直径通过的节点

    现在使用此信息,我们可以找到此节点(max_dia_节点)的最大深度左子节点和右子节点。由此,我们可以通过“父”数组获得实际节点

    这是树的两次遍历

    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));
    } 
    
    // 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);
    }