• 如何判断两棵二叉搜索树一致


    代码的思想和图片参考:好大学慕课浙江大学陈越、何钦铭的《数据结构》

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 
      4 
      5 
      6 /*
      7     需求:比较是否为相同的二叉搜索树
      8     我们知道的是:给定一个插入序列可以唯一的确定一棵二叉搜索树
      9     但是对于相同的一个二叉搜索树,不一定有同一个插入序列
     10     例如{2 3 1}和{2 1 3}就是相同的二叉搜索树
     11 
     12     输入要求:
     13     4 2     源二叉搜索树的节点个数N 有L个二叉搜索树需要和源二叉搜索进行比较
     14     3 1 4 2 源二叉搜索树
     15     3 4 1 2 需要进行比较的二叉搜索树
     16     3 2 4 1 被比较的二叉搜索树
     17     2 1     源二叉搜索树的节点个数 有几个二叉搜索树需要和源二叉搜索进行比较
     18     2 1     源二叉搜索树
     19     1 2     需要进行比较的二叉搜索树
     20     0       程序结束的标志
     21 
     22     输出
     23     ### 输出样例:
     24     Yes
     25     No
     26     No
     27 
     28     算法思路
     29     我们先使用源二叉树的节点建立一棵二叉搜索树
     30     然后在源二叉树中国对每个目的二叉树的每个元素进行查找
     31 
     32     如果每次搜索所经过的结点在前面均出现过,则一致
     33     否则(某次搜索中遇到前面未出现的结点),则不一致
     34 
     35     程序设计的思路:
     36     int main(){
     37         读入N和L
     38         建立源二叉树T
     39         比较T是否和L个二叉树一致,并打印结果
     40         return 0;
     41     }
     42 
     43     需要设计的主要函数
     44     1.读数据建树T
     45     2.判断一个序列是否和T构成相同的搜索树
     46 */
     47 
     48 typedef int elementType;
     49 
     50 /*define a binary tree*/
     51 typedef struct node{
     52     elementType element;
     53     struct node *left;
     54     struct node *right;
     55     int flag;/*为了标记某个节点是以及被访问过 1表示以及被访问过了,0表示没有被访问过*/
     56 }tre,*pTree;
     57 
     58 /*构造二叉搜索树
     59 @param N 二叉搜索树节点的个数
     60 @return 返回一个二叉搜索树的根节点
     61 */
     62 pTree buildTree(int N);
     63 
     64 /*
     65 把一个节点插入二叉搜索树中
     66 @param tree 已经存在的二叉搜索树
     67 @param element 需要插入到二叉搜索树的元素
     68 */
     69 pTree insert(pTree tree,elementType element);
     70 
     71 /*
     72 创建一个树的节点
     73 @param element 需要创建树节点的元素值
     74 */
     75 pTree newNode(int element);
     76 
     77 /*对二叉树进行先序遍历
     78 @param tree 需要进行先序遍历的二叉树
     79 */
     80 void preOrderTraversal(pTree tree);
     81 /*
     82 判断一棵二叉树是否和源二叉树一致
     83 @param tree 源二叉搜索树
     84 @param N 二叉搜索树的节点个数
     85 @return 如果相同 返回1,否则返回0
     86 */
     87 int judge(pTree tree,int N);
     88 
     89 /*把二叉搜索树的flag标志全部置0
     90 @param tree 需要把flag全部置0的二叉搜索树
     91 */
     92 void  resetTree(pTree tree);
     93 
     94 /*
     95 检查该元素是否是按照源二叉树的顺序插入二叉树
     96 在二叉树中搜索该元素,如果之前搜索到的元素flag都为1,当flag不为1时
     97 正是element==tree->element.表示此节点为正确插入节点,否则就为错误插入节点
     98 @param tree 源二叉搜索
     99 @param element 需要检测的元素
    100 @return 元素正确插入 返回1 否则返回0
    101 */
    102 int check(pTree tree,elementType element);
    103 
    104 /*释放tree
    105 @param tree 需要被释放的tree
    106 */
    107 void freeTree(pTree tree);
    108 int main(){
    109     int N,L;
    110     int i;
    111     scanf("%d",&N);
    112     while(N){
    113         scanf("%d",&L);
    114         pTree tree = buildTree(N);
    115         //preOrderTraversal(tree);
    116         for(i=0;i<L;i++){
    117             if(judge(tree,N)){
    118                 printf("Yes
    ");
    119             }else{
    120                 printf("No
    ");
    121             }
    122             resetTree(tree);
    123         }
    124         /*释放已经判断过得二叉搜索树*/
    125         freeTree(tree);
    126         scanf("%d",&N);
    127     }
    128     return 0;
    129 }
    130 
    131 pTree newNode(int element){
    132     pTree tree = (pTree)malloc(sizeof(tre));
    133     tree->element = element;
    134     tree->left=tree->right = NULL;
    135     //设置初始的标记位都为0,没有被访问
    136     tree->flag=0;
    137     return tree;
    138 }
    139 
    140 pTree insert(pTree tree,elementType element){
    141     if(!tree){
    142         tree = newNode(element);
    143     }else{/**/
    144         if(element<tree->element){
    145             tree ->left = insert(tree->left,element);
    146         }
    147         else if(element>tree->element){
    148             tree->right = insert(tree->right,element);
    149         }
    150     }
    151     return tree;
    152 }
    153 
    154 
    155 pTree buildTree(int N){
    156     int ele,i;
    157     pTree tree;
    158     scanf("%d",&ele);
    159     tree = newNode(ele);
    160     for(i=1;i<N;i++){
    161         scanf("%d",&ele);
    162         tree = insert(tree,ele);
    163     }
    164     return tree;
    165 }
    166 
    167 void preOrderTraversal(pTree tree){
    168     if(tree){
    169         printf("%d ",tree->element);
    170         preOrderTraversal(tree->left);
    171         preOrderTraversal(tree->right);
    172     }
    173 }
    174 
    175 int check(pTree tree,elementType element){
    176     if(tree->flag){
    177         if(element<tree->element){
    178             check(tree->left,element);
    179         }else if(element>tree->element){
    180             check(tree->right,element);
    181         }else{
    182             return 0;
    183         }
    184     }else{
    185         if(tree->element==element){
    186             tree->flag=1;
    187             return 1;
    188         }else{
    189             return 0;
    190         }
    191     }
    192 }
    193 
    194 
    195 int judge(pTree tree,int N){
    196     int elemen,i,flag=0;
    197     scanf("%d",&elemen);
    198     if(elemen!=tree->element){
    199         flag=1;
    200     }else{
    201         tree->flag=1;
    202     }
    203     for(i=1;i<N;i++){
    204         scanf("%d",&elemen);
    205         /*当已经判断出该二叉搜索树和源二叉搜索树不一致时,需要继续把数据读完,不然未读完的数据就会变成下一个树的元素*/
    206         if((!flag) && (!check(tree,elemen))){
    207             flag=1;
    208         }
    209     }
    210     if(flag){
    211         return 0;
    212     }else{
    213         return 1;
    214     }
    215 
    216 }
    217 
    218 void  resetTree(pTree tree){
    219     if(tree->left){
    220         resetTree(tree->left);
    221     }
    222     if(tree->right){
    223         resetTree(tree->right);
    224     }
    225     tree->flag=0;
    226 }
    227 
    228 void freeTree(pTree tree){
    229     if(tree->left){
    230         freeTree(tree->left);
    231     }
    232     if(tree->right){
    233         free(tree->right);
    234     }
    235     free(tree);
    236 }
    判断两棵二叉搜索树是否一致
  • 相关阅读:
    应用安全-Web安全-越权漏洞整理
    操作系统
    接码平台 | 临时邮箱生成网站
    shell反弹/端口转发/端口映射/内网穿透/代理/SSH中转/TLS加密传输/协议转换/DNS防污染/抓包工具整理
    远控CVE整理
    Windows系统CVE整理
    https的了解
    软件设计师备考
    https资料
    基本感觉比较好的书
  • 原文地址:https://www.cnblogs.com/yghjava/p/6719545.html
Copyright © 2020-2023  润新知