浙大資料結構,還原二叉樹
阿新 • • 發佈:2018-12-20
7-22 還原二叉樹 (25 分)
給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。
輸入格式:
輸入首先給出正整數N(≤50),為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為N的不包含重複英文字母(區別大小寫)的字串。
輸出格式:
輸出為一個整數,即該二叉樹的高度。
輸入樣例:
9
ABDFGHIEC
FDHGIBEAC
輸出樣例:
5
主要就是用到了遞迴的方式來建立二叉樹,要注意建立的時候,區間的選取和長度。
#include<iostream> using namespace std; typedef struct TreeNode *Position; typedef Position BinTree; struct TreeNode { BinTree left; BinTree right; char cp; }; BinTree findTree(char* in , char* pre , int len) { if(len==0) return NULL;//空的 BinTree str=new TreeNode; str->cp=*pre;//根節點是先序的第一個 int temp=0; for(int i=0; i<len; i++) { if(in[i]==*pre)//在中序裡找到根節點 break; temp++; } str->left=findTree(in,pre+1,temp);//用前半部分來建立左子樹 str->right=findTree(in+temp+1,pre+temp+1,len-temp-1);//用後半部分來建立右子樹,長度還要減去根節點那個 return str;//返回根節點 } int Len(BinTree str) { if(str==NULL) return 0; int l=Len(str->left);//左子樹 int r=Len(str->right);//右子樹 return l>r?l+1:r+1;//還有根節點 } int main() { char in[10000],pre[10000]; int n; cin>>n; char cp; for(int i=0; i<n; i++) {//先序 cin>>cp; pre[i]=cp; } for(int i=0; i<n; i++) {//中序 cin>>cp; in[i]=cp; } BinTree Node=new TreeNode; Node=findTree(in,pre,n); cout<<Len(Node)<<endl; }