如何获取二叉树中的最大路径开销

时间:2015-02-21 19:00:41

标签: c++ visual-c++

如何获取二叉树中的最大路径开销, 并打印一个向量包括所有路径数据元素?

我知道如何获得成本,但不知道如何获得元素矢量 有什么帮助吗?

struct Node
{
    int data;
    Node* left;
    Node* right;
};   

int treeMaxPath(Node* root) {
    if (root== NULL)
        return 0;
    else
        return root->data + max(treeMaxPath(root->left), treeMaxPath(root->right));
 }

3 个答案:

答案 0 :(得分:2)

  1. 自下而上处理树,存储data += max subtrees
  2. 从顶部开始,打印现在为(data - max subtrees)的值,然后打印最大的孩子。
  3. 自上而下并恢复数据值data -= max subtrees
  4. 注意:

    这是O(N)时间复杂度和O(1)的内存。 可以通过向Node添加新变量来更改为存储最大值而不修改数据。 可以轻松修改它以打印树中的所有最大路径。

    int maxChild(const Node *root) {
       return max(root->left ? root->left.data : 0,
                  root->right ? root->right.data : 0);
    }
    
    void treeBottomUp(Node* root) {
        if (root) {
           treeBottomUp(root->left);
           treeBottomUp(root->right);
           root->data += maxChild(root);
        }
    }
    
    void treeRestore(Node *root) {
       if (root) {
          root->data -= maxChild(root);
          treeRestore(root->left);
          treeRestore(root->right);
       }
    }
    
    void printMaxPath(const Node* root) {
       if (root) {
         printf("%d\n", root->data - maxChild(root));
         if (root->left && root->left.data >= maxChild(root)) {
            printMaxPath(root->left);
         } else {
            printMaxPath(root->right);
         }
       }
    }
    

    并且要做到这一切:

    void solveTree(Node *root) {
       treeBottomUp(root);
       printMaxPath(root);
       treeRestore(root);
    }
    

答案 1 :(得分:0)

返回pair的费用和路径。路径可以存储在vector<Node*>

答案 2 :(得分:0)

完成对整个树的treeMaxPath调用后(如果在根上调用整个树,则完成递归调用),您将使用深度值更新整个树。

现在,您可以轻松地使用一个简单的循环进行小型跟踪,以便沿着最高深度值从树根遍历,直到满足NULL子项。

p.s。我不确定您的treeMaxPath实施是否正确。如果您存储在某个节点的数据是深度,则应更改算法的某些部分。