二叉樹結點的共同祖先問題


【問題描述】假設二叉樹采用二叉鏈表方式存儲,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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM