zoukankan      html  css  js  c++  java
  • 二叉树结点的共同祖先问题

    【问题描述】假设二叉树采用二叉链表方式存储,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 }
  • 相关阅读:
    统计学六:逻辑回归
    数据分析五:因子分析
    统计学四:聚类分析
    统计学三:线性回归
    统计学二:假设检验与参数估计
    统计学一:描述统计
    数据分析十:高价值用户识别
    数据分析九:互联网征信中的信用评分模型(用户APP使用行为分析)
    数据分析八:互联网征信中的信用评分模型(刷卡行为分析)
    数据分析七:数据治理
  • 原文地址:https://www.cnblogs.com/yundong333/p/11000897.html
Copyright © 2011-2022 走看看