二叉樹高度的三種計算方法
阿新 • • 發佈:2018-12-30
計算二叉樹的高度可以採用幾種不同的演算法。 演算法一:採用後序遍歷二叉樹,結點最大棧長即為二叉樹的高度; 演算法二:層次遍歷二叉樹,最大層次即為二叉樹的高度; 演算法三:採用遞迴演算法,求二叉樹的高度。 /法1:後序遍歷,結點最大棧長即為樹的高度 //法2:層次遍歷,層次即為高度 //法3:遞迴求樹高 //除錯程式輸入二叉樹:-+a##*b##-c##d##/e##f## //程式輸出該二叉樹的高度:5
#include<iostream> #include<stack> #include<queue> using namespace std; typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; void CreateTree(BiTree &T) { char ch; cin>>ch; if(ch=='#') T=NULL; else { T=(BiTree)malloc(sizeof(BiTNode)); if(!T) cout<<"生成結點錯誤!"<<endl; T->data=ch; CreateTree(T->lchild); CreateTree(T->rchild); } } //法1:後序遍歷,結點最大棧長即為樹的高度 int BT_high(BiTree T) { BiTree p=T,r=NULL; int max=0; //樹高 stack<BiTree> s; while(p||!s.empty()) { if(p!=NULL) { s.push(p); p=p->lchild; } else { p=s.top(); if(p->rchild!=NULL && p->rchild!=r) p=p->rchild; else { if(s.size()>max) max=s.size();//最大層次即為高度 r=p; s.pop(); p=NULL; } } } return max; } //法2:層次遍歷,層次即為高度 int BT_level_depth(BiTree T) { if(!T) return 0; BiTree p=T,Q[100]; int front=-1,rear=-1,last=0,level=0; Q[++rear]=p; while(front<rear) { p=Q[++front]; if(p->lchild) Q[++rear]=p->lchild; if(p->rchild) Q[++rear]=p->rchild; if(front==last) { last=rear; level++; //層次+1 } } return level; } //法3:遞迴求樹高1 int max1=0;//樹高 int BT_depth1(BiTree T,int depth) { if(T) { if(T->lchild) BT_depth1(T->lchild,depth+1); if(T->rchild) BT_depth1(T->rchild,depth+1); } if(depth>max1) max1=depth; return depth; } //法3:遞迴求樹高2 int Height (BiTree T) { if(T==NULL) return 0; else { int m = Height ( T->lchild ); int n = Height(T->rchild); return (m > n) ? (m+1) : (n+1); } } int main() { BiTree T=NULL; CreateTree(T); cout<<"後序遍歷求樹高:"<<endl; cout<<BT_high(T)<<endl; cout<<"層次遍歷求樹高:"<<endl; cout<<BT_level_depth(T)<<endl; cout<<"遞迴求樹高1:"<<endl; BT_depth1(T,1); cout<<max1<<endl; cout<<"遞迴求樹高2:"<<endl; cout<<Height(T)<<endl; return 0; }