二叉樹求深度和寬度,葉子節點數,總結點數
阿新 • • 發佈:2019-01-09
#include<iostream> //#include<malloc.h> //c malloc和free,C++ new和delete #include<queue> using namespace std; //二叉連結串列方式,最常用 #define MAXSIZE 100 typedef char ElementType; struct BTNode{ ElementType data; BTNode *lchild; BTNode *rchild; }; //先序建立二叉樹 BTNode * CreateTree(){ BTNode * T=new BTNode;//(BTNode *)malloc(sizeof(BTNode)) char ch;cin>>ch;//輸入 if(ch=='#'){ return NULL; }else{ T->data=ch; T->lchild=CreateTree(); T->rchild=CreateTree(); } return T; } //利用後序遍歷求二叉樹的深度,節點個數 int PostTree(BTNode * T){ if(!T) return 0; int left,right,depth,nodenum; left=PostTree(T->lchild); right=PostTree(T->rchild); depth=( left>right?left:right )+1; //深度=max(left,right)+1 nodenum=left+right+1;//節點個數=left+right+1 return depth; //return nodenum;求節點數 } //求葉子節點個數 int Leaf(BTNode * T){ if(!T) return 0; if( !(T->lchild) && !(T->rchild) ){ return 1; }else return ( Leaf(T->lchild)+Leaf(T->rchild) ); } //求二叉樹的寬度(同一層上的最大節點數),利用佇列 int MaxNode(BTNode * T){ if(!T) return 0; int frontLevelWidth,curLevelWidth,maxLevelWidth;//上層的節點總數,本層的節點總數 ,節點數最大值 queue<BTNode *> que; BTNode * p; que.push(T);//根節點入隊 frontLevelWidth=1; maxLevelWidth=1;//最少有一個根節點 while(!que.empty()){//保證佇列不空 while(frontLevelWidth){ p=que.front(); que.pop(); if(p->lchild) que.push(p->lchild); if(p->rchild) que.push(p->rchild); frontLevelWidth--; } curLevelWidth=que.size(); if(curLevelWidth>maxLevelWidth) maxLevelWidth=curLevelWidth; frontLevelWidth=curLevelWidth; } return maxLevelWidth; } int main(){ //freopen("input.txt","r",stdin);//ABD###CE##F## BTNode * T; T=CreateTree(); cout<<PostTree(T)<<endl; cout<<MaxNode(T)<<endl; return 0; }
關於先序建樹