Update 树.cpp

master
ml92c58js 2 years ago
parent bc5062f95f
commit d5b31bf930

@ -1,98 +1,99 @@
#include <vector>
#include <string> #include <vector>
#include <stdlib.h> #include <string>
using namespace std; #include <stdlib.h>
typedef int ElemType; using namespace std;
typedef struct node typedef int ElemType;
{ typedef struct node
ElemType data; //数据元素 {
struct node* lchild; //指向左孩子结点 ElemType data; //数据元素
struct node* rchild; //指向右孩子结点 struct node* lchild; //指向左孩子结点
} BTNode; //二叉链结点类型 struct node* rchild; //指向右孩子结点
} BTNode; //二叉链结点类型
BTNode* CreateBTree(ElemType a[], ElemType b[], int n)
//对应例2.8的算法由先序序列a[0..n-1]和中序序列b[0..n-1]建立二叉链 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; int k;
ElemType root = a[0]; //根结点值 if (n <= 0) return NULL;
BTNode* bt = (BTNode*)malloc(sizeof(BTNode)); ElemType root = a[0]; //根结点值
bt->data = root; BTNode* bt = (BTNode*)malloc(sizeof(BTNode));
for (k = 0; k < n; k++) //在b中查找b[k]=root的根结点 bt->data = root;
if (b[k] == root) for (k = 0; k < n; k++) //在b中查找b[k]=root的根结点
break; if (b[k] == root)
bt->lchild = CreateBTree(a + 1, b, k); //递归创建左子树 break;
bt->rchild = CreateBTree(a + k + 1, b + k + 1, n - k - 1); //递归创建右子树 bt->lchild = CreateBTree(a + 1, b, k); //递归创建左子树
return bt; bt->rchild = CreateBTree(a + k + 1, b + k + 1, n - k - 1); //递归创建右子树
} return bt;
}
void DispBTree(BTNode* bt)
//采用括号表示输出二叉链bt void DispBTree(BTNode* bt)
{ //采用括号表示输出二叉链bt
if (bt != NULL) {
{ if (bt != NULL)
printf("%d", bt->data); {
if (bt->lchild != NULL || bt->rchild != NULL) printf("%d", bt->data);
{ if (bt->lchild != NULL || bt->rchild != NULL)
printf("("); //有孩子结点时才输出( {
DispBTree(bt->lchild); //递归处理左子树 printf("("); //有孩子结点时才输出(
if (bt->rchild != NULL) printf(","); //有右孩子结点时才输出, DispBTree(bt->lchild); //递归处理左子树
DispBTree(bt->rchild); //递归处理右子树 if (bt->rchild != NULL) printf(","); //有右孩子结点时才输出,
printf(")"); //有孩子结点时才输出) DispBTree(bt->rchild); //递归处理右子树
} printf(")"); //有孩子结点时才输出)
} }
} }
}
void DestroyBTree(BTNode*& bt)
//释放以bt为根结点的二叉树 void DestroyBTree(BTNode*& bt)
{ //释放以bt为根结点的二叉树
if (bt != NULL) {
{ if (bt != NULL)
DestroyBTree(bt->lchild); {
DestroyBTree(bt->rchild); DestroyBTree(bt->lchild);
free(bt); DestroyBTree(bt->rchild);
} free(bt);
} }
int maxsum = 0; //全局变量:存放最大路径和。 }
vector<int> maxpath; //全局变量:存放最大路径 int maxsum = 0; //全局变量:存放最大路径和。
void Findmaxpath(BTNode* bt, vector <int > apath, int asum) vector<int> maxpath; //全局变量:存放最大路径
//求根结点到叶结点的路径和最大的路径 void Findmaxpath(BTNode* bt, vector <int > apath, int asum)
{ //求根结点到叶结点的路径和最大的路径
if (bt == NULL) //空树直接返回 {
return; if (bt == NULL) //空树直接返回
apath.push_back(bt->data); asum += bt->data; //bt结点加入apath return;
asum += bt->data; //累计a路径和。 apath.push_back(bt->data); asum += bt->data; //bt结点加入apath
if (bt->lchild == NULL && bt->rchild == NULL) //bt结点为叶结点 asum += bt->data; //累计a路径和。
{ if (bt->lchild == NULL && bt->rchild == NULL) //bt结点为叶结点
if (asum - maxsum) {
{ if (asum - maxsum)
maxsum = asum; {
maxpath.clear(); maxsum = asum;
maxpath = apath; maxpath.clear();
} maxpath = apath;
} }
Findmaxpath(bt->lchild, apath, asum); //在左子树中查找 }
Findmaxpath(bt->rchild, apath, asum); //在右子树中查找 Findmaxpath(bt->lchild, apath, asum); //在左子树中查找
} Findmaxpath(bt->rchild, apath, asum); //在右子树中查找
int main() }
{ int main()
BTNode* bt; {
ElemType a[] = { 5,2,3,4,1,6 }; BTNode* bt;
ElemType b[] = { 2,3,5,1,4,6 }; ElemType a[] = { 5,2,3,4,1,6 };
int n = sizeof(a)/sizeof(a[0]); ElemType b[] = { 2,3,5,1,4,6 };
bt = CreateBTree(a,b,n); int n = sizeof(a)/sizeof(a[0]);
printf("实验结果:\n"); bt = CreateBTree(a,b,n);
printf("二叉树bt:"); printf("实验结果:\n");
DispBTree(bt); printf("二叉树bt:");
printf("'in"); DispBTree(bt);
printf("最大路径"); printf("'in");
vector<int> apath; printf("最大路径");
int asum = 0; vector<int> apath;
Findmaxpath(bt,apath,asum); int asum = 0;
printf("路径和: % d路径 : ",maxsum); Findmaxpath(bt,apath,asum);
for (int i=0;i < maxpath.size();i++) printf("路径和: % d路径 : ",maxsum);
printf("%d ",maxpath[i]); for (int i=0;i < maxpath.size();i++)
printf("\n"); printf("%d ",maxpath[i]);
printf("销毁树bt\n"); printf("\n");
DestroyBTree(bt); printf("销毁树bt\n");
} DestroyBTree(bt);
}
Loading…
Cancel
Save