每日算法(6):二叉树中最大和的路径

假设二叉树中所有结点值为int类型,采用二叉链存储。设计递归算法求二叉树bt中从根结点到叶子结点路径和最大的一条路径。编写完整的实验程序,并采用相应数据。

思路:

建立二叉树有两种方法:

一种方法是利用二叉树的性质来建立二叉树;

另一种方法是一个递归方法,与先序遍历有点相似。建立后,通过先序、中序、后序遍历,对二叉树有了进一步的理解与掌握。

首先我们要先知道二叉树的结构,数据、左右孩子,然后就是定义二叉树的基本操作:

①创建二叉树:判断是否为空树;相反则通过先序、中序的规律,求出二叉树

②输出二叉树:第一位数肯定是根节点,然后递归输出左右孩子

③销毁:这个很简单,直接释放。

求解最大和路径,程序中有具体解析。

#include <vector>
#include <string>
using namespace std;
typedef int ElemType;
typedef struct node
{
	ElemType data;				//数据元素
	struct node* lchild;		//指向左孩子结点
	struct node* rchild;		//指向右孩子结点
} BTNode;						//二叉链结点类型
BTNode* CreateBTree(ElemType a[], ElemType b[], int n)
//对应例2.8的算法由先序序列a[0..n-1]和中序序列b[0..n-1]建立二叉链
{
    int k;
    if (n <= 0) return NULL;
    ElemType root = a[0];			//根结点值
    BTNode* bt = (BTNode*)malloc(sizeof(BTNode));
    bt->data = root;
    for (k = 0; k < n; k++) //在b中查找b[k]=root的根结点
        if (b[k] == root)
            break;
    bt->lchild = CreateBTree(a + 1, b, k);    //递归创建左子树
    bt->rchild = CreateBTree(a + k + 1, b + k + 1, n - k - 1);  //递归创建右子树
    return bt;
}

void DispBTree(BTNode* bt)
//采用括号表示输出二叉链bt
{
    if (bt != NULL)
    {
        printf("%d", bt->data);
        if (bt->lchild != NULL || bt->rchild != NULL)
        {
            printf("(");		             //有孩子结点时才输出(
                DispBTree(bt->lchild);	             //递归处理左子树
                if (bt->rchild != NULL) printf(",");	//有右孩子结点时才输出,
                DispBTree(bt->rchild);	             //递归处理右子树
                printf(")");                                      //有孩子结点时才输出)
        }
    }
}

void DestroyBTree(BTNode*& bt)
//释放以bt为根结点的二叉树
{
    if (bt != NULL)
    {
        DestroyBTree(bt->lchild);
        DestroyBTree(bt->rchild);
        free(bt);
    }
}
int maxsum = 0; //全局变量:存放最大路径和。
vector<int> maxpath;    //全局变量:存放最大路径
void Findmaxpath(BTNode* bt, vector <int > apath, int asum)
//求根结点到叶结点的路径和最大的路径
{
    if (bt == NULL)    //空树直接返回
        return;
    apath.push_back(bt->data); asum += bt->data;    //bt结点加入apath
    asum += bt->data;  //累计a路径和。
    if (bt->lchild == NULL && bt->rchild == NULL) //bt结点为叶结点
    {
        if (asum - maxsum)
        {
            maxsum = asum;
            maxpath.clear();
            maxpath = apath;
        }
    }
    Findmaxpath(bt->lchild, apath, asum); //在左子树中查找
    Findmaxpath(bt->rchild, apath, asum); //在右子树中查找
}
void main()
{
    BTNode* bt;
    ElemType a[] = { 5,2,3,4,1,6 };
    ElemType b[] = { 2,3,5,1,4,6 };
    int n = sizeof(a)/sizeof(a[0]);
    bt = CreateBTree(a,b,n); 
    printf("实验结果:\n");
    printf("二叉树bt:"); 
    DispBTree(bt); 
    printf("'in");
    printf("最大路径");
    vector<int> apath;
    int asum = 0;
    Findmaxpath(bt,apath,asum); 
    printf("路径和: % d,路径 : ",maxsum);
    for (int i=0;i < maxpath.size();i++)
        printf("%d ",maxpath[i]);
    printf("\n");
    printf("销毁树bt\n");
    DestroyBTree(bt);
}

输出结果: 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值