二叉树结点的共同祖先问题

【问题描述】假设二叉树采用二叉链表方式存储,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 }

 

posted @ 2019-06-10 22:38  像走了一光年  阅读(1330)  评论(0编辑  收藏  举报