繁体   English   中英

如何获得二叉树中的最大路径成本

[英]how to get the max path cost in binary tree

如何获取二叉树中的最大路径成本,并打印包含所有路径数据元素的向量?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM