如何在二叉树中得到最大路径代价

how to get the max path cost in binary tree

本文关键字:大路 路径 代价 二叉树      更新时间:2023-10-16

如何在二叉树中获得最大路径代价,并打印包含所有路径数据元素的矢量?

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

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));
 }
  1. 自下而上处理树,存储data += max subtrees
  2. 从顶部开始,打印现在为(data - max subtrees)的值,然后打印最大子项
  3. 自上而下恢复数据值,data -= max subtrees

注:

这是O(N)的时间复杂度,对于内存是O(1)。可以在不修改数据的情况下通过向Node添加新变量将其更改为存储max。可以很容易地修改它以打印树中的所有最大路径。

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("%dn", 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);
}

返回成本和路径的pair。该路径可以存储在vector<Node*>中。

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

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

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