编写c++算法求任意二叉树中一条最长的路径,并输出此路径上各结点的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写c++算法求任意二叉树中一条最长的路径,并输出此路径上各结点的值相关的知识,希望对你有一定的参考价值。

参考技术A #include <stdio.h>
#define MaxSize 1000

typedef struct BiTNode
int data;
struct BiTNode *lchild, *rchild;
BiTNode,*BiTree;

void LongestPath(BiTree bt)//求二叉树中的第一条最长路径长度,并输出最长路径上的节点

BiTree p = bt, l[MaxSize], s[MaxSize]; //l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点
int i,top = 0, tag[MaxSize], longest = 0;
while (p || top >0)

while (p)

s[++top] = p;
tag[top] = 0;
p = p->lchild;
//沿左分枝向下
if (tag[top] == 1) //当前结点的右分枝已遍历

if (!s[top]->lchild && !s[top]->rchild) //只有到叶子结点时,才查看路径长度
if (top>longest)

for (i = 1; i <= top; i++)
l[i] = s[i];
longest = top;
top--;
//保留当前最长路径到l栈,记住最高栈顶指针,退栈

else if (top>0)

tag[top] = 1;
p = s[top]->rchild;
//沿右子分枝向下
//while(p!=null||top>0)
int k = 0;
for (k = 0; k < longest; k++)

printf("%d ", l[k]->data);

//结束LongestPath
参考技术B 喜欢跟爱一样吗? 参考技术C csdn论坛 里边有答案

5.16算法每日练习二叉树中最大路径和

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。
在这里插入图片描述

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

public class MaxPathSum124 {
    private static int res = Integer.MIN_VALUE;

    public static int maxPathSum(TreeNode root) {
        getMax(root);
        return res;
    }

    private static int getMax(TreeNode root) {
        if (root == null)return 0;
        //计算左边分支最大值,左边分支如果为负数还不如不选择,即设为0
        int left = Math.max(0, getMax(root.left));
        //计算右边分支最大值,右边分支如果为负数还不如不选择,即设为0
        int right = Math.max(0, getMax(root.right));
        //节点的最大路径和取决于该节点的值与该节点左右子节点的最大贡献值,与之前的作比较然后更新
        res = Math.max(res, root.val + left + right);
        //只能选一条路,要么是左子树+根,要么右子树+根 
        return Math.max(left,right) + root.val;

    }

    public static void main(String[] args) {
        TreeNode node = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        node.left = node2;
        node.right = node3;
        int res = maxPathSum(node);
    }
}

测试case:
[-3,2,3] res = 3,右子树节点
[1,2,-3] res = 3,左子树节点加根节点

考察点分析:深度优先查找,找出每个节点的最大贡献,最大的就是结果。如上面这个例子,先找左子树节点的最大贡献值是2,然后右子树节点的最大贡献值是3,最后根节点的最大贡献值为6,

时间复杂度:O(N),N为节点个数。
空间复杂度:O(N) ,N为节点个数。这个例子递归最大有三层,第三层为空子树,判断为空后就返回上一层。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

以上是关于编写c++算法求任意二叉树中一条最长的路径,并输出此路径上各结点的值的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版) 树和二叉树 算法设计Demo7

数据结构与算法之深入解析“二叉树中的最长交错路径”的求解思路与算法示例

5.16算法每日练习二叉树中最大路径和

设计一个算法,计算出给定二叉树中任意2 个结点之间的最短路径。

Java案例:二叉树中的最大路径和

C++如何求二叉树中一个结点到根节点的路径?