【問題描述】假設二叉樹采用二叉鏈表方式存儲,root指向根結點,p所指結點和q所指結點為二叉樹中的兩個不同結點,且互不成為根到該結點的路徑上的點,編程求解距離它們最近的共同祖先。
【輸入形式】二叉樹的前序和中序遍歷序列,用以創建該二叉樹的鏈式存儲結構;以及二叉樹的兩個結點數據 x 和 y
【輸出形式】結點數據值為 x 和結點數據值為 y 的最近的共同祖先,若沒有共同祖先則輸出NULL
【樣例輸入】
GABDCEF
BDAEFCG
DF
【樣例輸出】
A
1 2019/6/10 22:37:28 2 #include<bits/stdc++.h> 3 using namespace std; 4 #define N 20 5 typedef struct Tree{ 6 7 char data; 8 struct Tree *LeftChild; 9 struct Tree *RightChild; 10 }BiTNode , *BiTree; 11 BiTree Only(char *pre,char *in,int length){ //根據前序序列和中序序列唯一確定一個二叉樹 12 BiTree root; 13 root=(BiTree)malloc(sizeof(BiTNode)); 14 root->data=*pre; 15 int index; 16 if(length==0){ return 0;} //哇哦 這句話真是重中之重 17 for(index=0;index<length;index++){ 18 if(root->data==in[index]){ 19 break; 20 } 21 } //到了中序序列第幾號元素:index==根節點==前序序列第一個元素 22 23 //遞歸 開始找根節點的左子樹------的根節點 24 root->LeftChild=Only(pre+1,in,index); 25 //遞歸 開始找根節點的右子樹-------的根節點 26 root->RightChild=Only(pre+1+index,in+index+1,length-index-1); 27 return root; 28 } 29 30 bool Cover(BiTree root,char pt){ 31 32 if(root==NULL) { return false;} 33 if(root->data==pt){ 34 return true; 35 }else{ 36 return Cover(root->LeftChild,pt)||Cover(root->RightChild,pt) ; 37 } 38 } 39 BiTree SearchCommen(BiTree node,char pt1, char pt2){ 40 41 42 if(node==NULL){ return NULL;} //沒有找到或者node壓根就是個空的 返回null; 43 if(node->data==pt1||node->data==pt2){ return NULL;}//一個元素和根節點元素撞了,另一個是子元素,二者沒有共同祖先 44 45 //兩個元素都是正常的子節點的元素 46 //先在根節點的左子樹里面找兩個元素 47 bool t1=Cover(node->LeftChild,pt1);//leftchild pt1 48 bool t2=Cover(node->LeftChild,pt2);//leftchild pt2 49 50 if(t1!=t2) { return node;} //兩個元素 一個在左邊找到了 一個沒找到 證明一左一右 所以祖先就是node 51 else{ 52 //t1=t2 如果都等於true 就是兩個元素都在左子樹這邊 所以往下循環就好 53 if(t1==true) { return SearchCommen(node->LeftChild,pt1,pt2);} 54 //t1=t2 如果都等於No 證明沒有在左子樹找到,那么就一定在右子樹 55 if(t2==true) { return SearchCommen(node->RightChild,pt1,pt2);} 56 } 57 } 58 59 int main(){ 60 BiTree pt; 61 /*假設二叉樹采用二叉鏈表方式存儲*/ 62 char pre[N]; 63 char in[N]; 64 char *preo=pre; 65 char *ino=in; 66 char ch1,ch2; 67 int length; 68 cout<<"輸入前序序列"; 69 cin>>pre; 70 cout<<endl; 71 cout<<"輸入中序序列"; 72 cin>>in; 73 cout<<endl; 74 length=strlen(pre); 75 pt=Only(pre,in,length); 76 77 cin>>ch1>>ch2; 78 pt=SearchCommen(pt,ch1,ch2); 79 if(pt){ cout<<pt->data;} 80 else{ cout<<"NULL";} 81 }
