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


    【问题描述】假设二叉树采用二叉链表方式存储,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 }
  • 相关阅读:
    分布式与集群的区别是什么?
    Java NIO:IO与NIO的区别 JAVA BIO与NIO、AIO的区别
    localStorage使用总结 JS 详解 Cookie、 LocalStorage 与 SessionStorage
    tomcat+nginx+redis实现均衡负载、session共享 存储过程的优缺点 HTTP、TCP、IP协议常见面试题
    高并发下的Java数据结构(List、Set、Map)
    [剑指offer] 31. 整数中1出现的次数(从1到n整数中1出现的次数)
    [剑指offer] 30. 连续子数组的最大和
    [剑指offer] 29. 最小的K个数
    [剑指offer] 28. 数组中出现次数超过一半的数字
    [leetcode] 51. N-Queens (递归)
  • 原文地址:https://www.cnblogs.com/yundong333/p/11000897.html
Copyright © 2020-2023  润新知