1. 程式人生 > >swust oj 971

swust oj 971

關系 esp iostream anti bcd div problem void esc

統計利用先序遍歷創建的二叉樹的深度

10000(ms) 10000(kb) 3331 / 8436 利用先序遞歸遍歷算法創建二叉樹並計算該二叉樹的深度。先序遞歸遍歷建立二叉樹的方法為:按照先序遞歸遍歷的思想將對二叉樹結點的抽象訪問具體化為根據接收的數據決定是否產生該結點從而實現創建該二叉樹的二叉鏈表存儲結構。約定二叉樹結點數據為單個大寫英文字符。當接收的數據是字符"#"時表示該結點不需要創建,否則創建該結點。最後再統計創建完成的二叉樹的深度(使用二叉樹的後序遍歷算法)。需要註意輸入數據序列中的"#"字符和非"#"字符的序列及個數關系,這會最終決定創建的二叉樹的形態。

輸入

輸入為先序遍歷二叉樹結點序列。

輸出

對應的二叉樹的深度。

樣例輸入

A##
ABC####
AB##C## 
ABCD###E#F##G## 
A##B##

樣例輸出

1 
3 
2
4
1

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cstdio>
 6 typedef int Datetype;
 7 using namespace std;
8 typedef struct link{ 9 Datetype date; 10 struct link *lchild; 11 struct link *rchild; 12 }tree; 13 14 void creattree(tree *&L) 15 { 16 char c; 17 cin>>c; 18 if(c==#) 19 L=NULL; 20 else 21 { 22 L = (tree *)malloc(sizeof(tree)) ;
23 L->date=c; 24 creattree(L->lchild); 25 creattree(L->rchild); 26 } 27 } 28 29 void destroytree(tree *&L) 30 { 31 if(L!=NULL) 32 { 33 destroytree(L->lchild); 34 destroytree(L->rchild); 35 free(L); 36 } 37 } 38 39 int deep(tree *L) 40 { 41 int ldep,rdep,max; 42 if(L!=NULL) 43 { 44 ldep=deep(L->lchild); 45 rdep=deep(L->rchild); 46 max=ldep>rdep?ldep+1:rdep+1; 47 return max; 48 } 49 else 50 return 0; 51 } 52 53 int main() 54 { 55 tree *L = NULL; 56 int x; 57 creattree(L); 58 x=deep(L); 59 cout<<x; 60 destroytree(L); 61 return 0; 62 }

swust oj 971