求二叉树中最大和的路径(C语言实现)

本文介绍了一种递归算法,用于寻找二叉树中从根节点到叶子节点路径和最大的路径。通过递归求解左右子树的最大路径和,最终得到整棵树的最大路径和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.题目概述:

2.题目解析:

3.题目代码:

4.样例展示:

5. 题目总结:


1.题目概述:

假设二叉树中的所有节点值为int类型,采用二叉链表存储。设计递归算法求二叉树bt中从根结点到叶子结点路径和最大的一条路径。例如,对于下图所示的二叉树,路径和最大的一条路径是5→4→6,路径和是15.


 


2.题目解析:

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

路径和:是路径中各节点值的总和。


题目思路:递归实现。
递归函数的定义:求解包含根节点的最大路径和。

递归终止条件

如果根节点为null,直接返回0。

递归过程

递归求解包含左孩子的以左孩子为根结点的最大路径和maxLeft,以及包含右孩子的以左孩子为根结点的最大路径和maxRight。

如果maxLeft > 0,我们的当前的最大路径和就应该加上maxLeft。

如果maxRight > 0,我们的当前的最大路径和就应该加上maxRight。

最大路径和maxResult取maxResult和当前最大路径和的较大值。

该递归函数的返回结果应该是根节点的值,根节点的值加上maxLeft的值,根节点的值加上maxRight的值,这三者间的较大值。

时间复杂度和空间复杂度均为O(h),其中h为树的高度。


3.题目代码:

#include <stdio.h>
#include <stdlib.h>
#define exitence -1
typedef struct BiTNode
{
	int data;
	struct BiTNode *lTree, *rTree;
} BiTNode, *BiTree;
void CreateBiTree(BiTree *T)
{
	int n;
	scanf("%d", &n);
	if (n == 0)
		*T = NULL;
	else
	{
		*T = (BiTNode *)malloc(sizeof(BiTNode));
		if (NULL == *T)
			exit(exitence);
		(*T)->data = n;
		CreateBiTree(&((*T)->lTree));
		CreateBiTree(&((*T)->rTree));
	}
}
int RouteSumMax();
void Route();
int Max();
int main()
{
	BiTree T = NULL;
	printf("请输入所有节点的数值:\n");
	CreateBiTree(&T);
	printf("路径和最大的一条路径是:");
	Route(T);
	printf("\n路径和是:%d", RouteSumMax(T));
	return 0;
}
int Max(int x, int y)
{
	if (x >= y)
		return x;
	else
		return y;
}
int RouteSumMax(BiTree T)
{
	if (T == 0)
		return 0;
	else
		return Max(T->data + RouteSumMax(T->lTree), T->data + RouteSumMax(T->rTree));
}
void Route(BiTree T)
{
	if (T)
	{
		printf("%d ", T->data);
		if (RouteSumMax(T->lTree) >= RouteSumMax(T->rTree))
		{
			Route(T->lTree);
		}
		else
		{
			Route(T->rTree);
		}
	}
}

4.样例展示:


5. 题目总结:

        这个问题重难点在于首先是二叉树的构造,接着最重要的是采取递归函数计算左右子树的最大路径和。递归并非指整个函数递归,而是说其中一个子函数使用了递归,简单的理解为:当前节点的值,加上左子树递归结果和右子树递归结果的最大值,我认为,左子树和右子树的递归蕴含着分治策略的思想。这是对该问题的简要分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小航同学吖

制作不易,动动你的小手

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值