1.問題分析
我們提供的服務有:成都網(wǎng)站制作、網(wǎng)站設計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、吉陽ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的吉陽網(wǎng)站制作公司采用遞歸算法,當一個節(jié)點的子樹存在時,返回其左右子樹與該節(jié)點和的大值。
2.解題思路
二叉樹存儲結(jié)構(gòu)
typedef struct BiTNode {
int data; //結(jié)點元素
struct BiTNode* lchild; //左孩子指針
struct BiTNode* rchild; //右孩子指針
}BiTNode, *BiTree;
創(chuàng)建二叉樹
BiTree Create(){//輸入-1代表該節(jié)點為空
int data;
int temp;
BiTree T;
scanf("%d",&data);
temp=getchar();
if(data==-1) {
return NULL;
}
else{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=data;
printf("輸入%d的左子樹:",data);
T->lchild=Create();
printf("輸入%d的右子樹:",data);
T->rchild=Create();
return T;
}
}
遞歸求大代價路徑
int Max(int a,int b){
return (a>b?a:b);
}
int RouteSumMax(BiTree T){
if(T==NULL) return 0;
else return Max(T->data+RouteSumMax(T->lchild),T->data+RouteSumMax(T->rchild));
}
void Route(BiTree T){
if(T){
printf("%d ",T->data);
if(RouteSumMax(T->lchild)>=RouteSumMax(T->rchild)){
Route(T->lchild);
}
else{
Route(T->rchild);
}
}
}
3.程序出現(xiàn)的BUG
沒有出現(xiàn)BUG
4.實驗總結(jié):對于有關(guān)二叉樹的算法,采用遞歸可以很有效的解決問題
5.附錄-源碼
#include#include#includetypedef struct BiTNode {
int data; //結(jié)點元素
struct BiTNode* lchild; //左孩子指針
struct BiTNode* rchild; //右孩子指針
}BiTNode, *BiTree; //二叉樹結(jié)點與指向二叉樹結(jié)點的指針
//創(chuàng)建二叉樹
BiTree Create(){//輸入-1代表該節(jié)點為空
int data;
int temp;
BiTree T;
scanf("%d",&data);
temp=getchar();
if(data==-1) {
return NULL;
}
else{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=data;
printf("輸入%d的左子樹:",data);
T->lchild=Create();
printf("輸入%d的右子樹:",data);
T->rchild=Create();
return T;
}
}
//大代價路徑
int Max(int a,int b){
return (a>b?a:b);
}
int RouteSumMax(BiTree T){
if(T==NULL) return 0;
else return Max(T->data+RouteSumMax(T->lchild),T->data+RouteSumMax(T->rchild));
}
void Route(BiTree T){
if(T){
printf("%d ",T->data);
if(RouteSumMax(T->lchild)>=RouteSumMax(T->rchild)){
Route(T->lchild);
}
else{
Route(T->rchild);
}
}
}
int main(){
BiTree T;
T=Create();
system("cls");
printf("大代價路徑:");
Route(T);
printf("\n");
int mcp=RouteSumMax(T);
printf("大路徑代價:%d\n",mcp);
return 0;
}
效果展示:
輸入:
輸出:
二、二叉樹中數(shù)據(jù)域值大于50的節(jié)點
1.問題分析
如何計算結(jié)點所在層數(shù):對二叉樹進行層序遍歷,當一層的節(jié)點全部出隊后,隊列中剩余結(jié)點是下一層的結(jié)點,此時隊列中的結(jié)點個數(shù)就是下一層的結(jié)點個數(shù),根據(jù)每一層結(jié)點個數(shù)來確定某個結(jié)點所在層數(shù)
2.解題思路
二叉樹存儲結(jié)構(gòu)
typedef struct bitnode{
int data;
int number;//結(jié)點序號
struct bitnode *lchild;
struct bitnode *rchild;
}bitnode,*bitree;
隊列
typedef struct queue{
bitree a[MAX];
int front;
int rear;
int num;
}queue,*queueptr;
隊列基本操作(初始化,判空,入隊出隊,隊列長度)
void Init(queueptr q){
q->front=q->rear=0;
q->num=0;
}
int queueEmpty(queue q){
if(q.front==q.rear) return 1;
else return 0;
}
void enqueue(queueptr q,bitree e){
if(q->rear>=MAX) return ;
q->a[q->rear]=e;
q->rear++;
q->num++;
}
void dequeue(queueptr q,bitree *e){
*e=q->a[q->front];
q->front++;
q->num--;
}
int getLengh(queueptr q){
return q->num;
}
存儲大于50結(jié)點的數(shù)組
typedef struct node{
int levelnum;//層數(shù)
int val;//值
int serial;//序號
}node;
創(chuàng)建二叉樹
bitree Create(){
int data;
int temp;
bitree T;
scanf("%d",&data);
temp=getchar();
if(data==-1) {
return NULL;
}
else{
T=(bitree)malloc(sizeof(bitnode));
T->data=data;
printf("輸入%d的左子樹:",data);
T->lchild=Create();
printf("輸入%d的右子樹:",data);
T->rchild=Create();
return T;
}
}
為二叉樹每個結(jié)點編號
void Serial(bitree t){
if(!t) return;
bitree p;
queue Q;
queueptr q=&Q;
int k=1;
Init(q);
enqueue(q,t);
while(!queueEmpty(Q)){
dequeue(q,&p);
p->number=k;
k++;
if(p->lchild) enqueue(q,p->lchild);
if(p->rchild) enqueue(q,p->rchild);
}
}
求data域大于50的結(jié)點
void GetMorethan50(bitree t){
int total[100];
node morethan[100];
for(int j=0;j<100;j++){
total[j]=0;
}
bitree p;
queue Q;
queueptr q=&Q;
Init(q);
enqueue(q,t);
int level=1;
int num=1;
int i,j;
for(j=0;j<100;j++){
morethan[j].levelnum=0;
morethan[j].serial=0;
morethan[j].val=0;
}
j=0;
while(!queueEmpty(Q)){
for(i=1;i<=num;i++){
dequeue(q,&p);
if(p->data>50) {
total[level]++;
morethan[j].levelnum=level;
morethan[j].serial=p->number;
morethan[j].val=p->data;
j++;
}
if(p->lchild) enqueue(q,p->lchild);
if(p->rchild) enqueue(q,p->rchild);
}
num=getLengh(q);
level++;
}
for(i=1;i
3.出現(xiàn)的BUG及解決方法
BUG:輸出的序號不正確,如多輸出一些序號且該序號為奇怪的數(shù)字
解決方法:原因是因為morethan數(shù)組未初始化,將數(shù)組初始化即可
4.實驗總結(jié):本實驗本質(zhì)上還是二叉樹的層次遍歷,通過本實驗讓我學會了確定某個結(jié)點在二叉樹中的層數(shù)的方法
5.附錄-源碼
#include#include#define MAX 100
typedef struct bitnode{
int data;
int number;
struct bitnode *lchild;
struct bitnode *rchild;
}bitnode,*bitree;
typedef struct queue{
bitree a[MAX];
int front;
int rear;
int num;
}queue,*queueptr;
typedef struct node{
int levelnum;
int val;
int serial;
}node;
//隊列基本操作
void Init(queueptr q){
q->front=q->rear=0;
q->num=0;
}
int queueEmpty(queue q){
if(q.front==q.rear) return 1;
else return 0;
}
void enqueue(queueptr q,bitree e){
if(q->rear>=MAX) return ;
q->a[q->rear]=e;
q->rear++;
q->num++;
}
void dequeue(queueptr q,bitree *e){
*e=q->a[q->front];
q->front++;
q->num--;
}
int getLengh(queueptr q){
return q->num;
}
//創(chuàng)建二叉樹
bitree Create(){
int data;
int temp;
bitree T;
scanf("%d",&data);
temp=getchar();
if(data==-1) {
return NULL;
}
else{
T=(bitree)malloc(sizeof(bitnode));
T->data=data;
printf("輸入%d的左子樹:",data);
T->lchild=Create();
printf("輸入%d的右子樹:",data);
T->rchild=Create();
return T;
}
}
void Serial(bitree t){
if(!t) return;
bitree p;
queue Q;
queueptr q=&Q;
int k=1;
Init(q);
enqueue(q,t);
while(!queueEmpty(Q)){
dequeue(q,&p);
p->number=k;
k++;
if(p->lchild) enqueue(q,p->lchild);
if(p->rchild) enqueue(q,p->rchild);
}
}
void GetMorethan50(bitree t){
int total[100];
node morethan[100];
for(int j=0;j<100;j++){
total[j]=0;
}
bitree p;
queue Q;
queueptr q=&Q;
Init(q);
enqueue(q,t);
int level=1;
int num=1;
int i,j;
for(j=0;j<100;j++){
morethan[j].levelnum=0;
morethan[j].serial=0;
morethan[j].val=0;
}
j=0;
while(!queueEmpty(Q)){
for(i=1;i<=num;i++){
dequeue(q,&p);
if(p->data>50) {
total[level]++;
morethan[j].levelnum=level;
morethan[j].serial=p->number;
morethan[j].val=p->data;
j++;
}
if(p->lchild) enqueue(q,p->lchild);
if(p->rchild) enqueue(q,p->rchild);
}
num=getLengh(q);
level++;
}
for(i=1;i
實驗效果
輸入:
輸出:
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧