C++ 統計二叉樹所有結點數、葉子結點數
阿新 • • 發佈:2019-01-25
統計所有結點數:
//統計所有結點數
int n1=0;
void countAllNode(BTNode *p)
{
if(p!=NULL)
{
++n1;
countAllNode(p->lchild);
countAllNode(p->rchild);
}
}
統計葉子結點數:
//統計葉子結點數 int n2=0; void countLeafNode(BTNode *p) { if(p!=NULL) { if(p->lchild==NULL&&p->rchild==NULL)//判斷是否葉子結點 ++n2; countLeafNode(p->lchild); countLeafNode(p->rchild); } }
完整測試程式碼:
#include <bits/stdc++.h> #define MaxSize 100 /* * Created by HarvestWu on 2018/06/22. */ using namespace std; typedef char ElemType; //定義二叉樹結構 typedef struct BTNode { ElemType data; struct BTNode *lchild; struct BTNode *rchild; } BTNode; //由先序遍歷、中序遍歷結果構建二叉樹 BTNode *CreateBT(ElemType pre[],ElemType in[],int l1,int r1,int l2,int r2) { BTNode *s; int i; if(l1>r1)return NULL; //序列中無元素返回NULL s=(BTNode*)malloc(sizeof(BTNode)); s->lchild=s->rchild=NULL; for(i=l2; i<=r2; ++i) if(in[i]==pre[l1]) //查詢等於當前子樹根的結點在in[]中的位置 break; s->data=in[i]; s->lchild=CreateBT(pre,in,l1+1,l1+i-l2,l2,i-1); s->rchild=CreateBT(pre,in,l1+i-l2+1,r1,i+1,r2); return s; //當前子樹處理完畢 } //統計所有結點數 int n1=0; void countAllNode(BTNode *p) { if(p!=NULL) { ++n1; countAllNode(p->lchild); countAllNode(p->rchild); } } //統計葉子結點數 int n2=0; void countLeafNode(BTNode *p) { if(p!=NULL) { if(p->lchild==NULL&&p->rchild==NULL) ++n2; countLeafNode(p->lchild); countLeafNode(p->rchild); } } int main() { BTNode *p; ElemType pre[]= {'A','B','D','E','H','J','K','L','M','N','C','F','G','I'}; ElemType in[]={'D','B','J','H','L','K','M','N','E','A','F','C','G','I'}; //由先序遍歷、中序遍歷結果構建二叉樹 p=CreateBT(pre,in,0,13,0,13); cout<<"統計所有結點數:"<<endl; countAllNode(p); cout<<n1<<endl; cout<<"統計葉子結點數:"<<endl; countLeafNode(p); cout<<n2<<endl; return 0; }