From 7589bef435d33b2cc9e691f292d75dc3fb64e711 Mon Sep 17 00:00:00 2001 From: pgftvecou <1714774285@qq.com> Date: Mon, 26 Jun 2023 01:22:28 +0800 Subject: [PATCH] ADD file via upload --- 二叉树最大路径和.cpp | 96 ++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 二叉树最大路径和.cpp diff --git a/二叉树最大路径和.cpp b/二叉树最大路径和.cpp new file mode 100644 index 0000000..6f8b0f3 --- /dev/null +++ b/二叉树最大路径和.cpp @@ -0,0 +1,96 @@ +#include +#include +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 maxpath; //全局变量:存放最大路径 +void Findmaxpath(BTNode* bt, vector 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 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); +}