zoukankan      html  css  js  c++  java
  • 基础实验4-2.1 树的同构 (25分)--二叉树

     

     

     

     解题思路:

    1、建二叉树(静态链表)

       不作为任何结点的孩子结点的即为根结点

    2、判断是否同构

    1)空树,同构

    2)两棵树中若只有其中一棵是空树,则不同构

    3)两棵树的根结点值不等,不同构

    4)若左子树均空,则递归判断右子树

    5)若左子树均不空,

         比较左子树的根结点值

         相等:则没有交换左右子树,判断树1左子树和树2左子树、树1右子树和树2右子树

         不等:交换左右子树,判断树1左子树和树2右子树,树1右子树和树2左子树

    解题思路:
    
    1、建二叉树(静态链表)
    
    不作为任何结点的孩子结点的即为根结点
    
    2、判断是否同构
    
    1)空树,同构
    
    2)两棵树中若只有其中一棵是空树,则不同构
    
    3)两棵树的根结点值不等,不同构
    
    4)若左子树均空,则递归判断右子树
    
    5)若左子树均不空且左子树的根结点值相等,则表明没有交换左右子树,递归判断树1左子树和树2左子树&&树1右子树和树2右子树
    
    否则, 交换左右子树,递归判断树1左子树和树2右子树&&树1右子树和树2左子树
    
    #include <stdio.h>
    #include <string.h>
    #define ElemType char
    #define Max 10
    typedef enum {false,true
                 } bool;
    typedef struct {
        ElemType Data;
        int Left,Right;
    } Tree;
    Tree T1[Max],T2[Max];
    int BuildTree(Tree T[]) {
        int n;
        scanf("%d",&n);
        int check[n];
        memset(check,0,sizeof(check));
        int i,root=-1;
        char l,r;
        if(n) {
            for(i=0; i<n; i++) {
                scanf("
    %c %c %c",&T[i].Data,&l,&r);
                {
                    if(l!='-') {
                        T[i].Left=l-'0';
                        check[l-'0']=1;
                    } else
                        T[i].Left=-1;
                    if(r!='-') {
                        T[i].Right=r-'0';
                        check[r-'0']=1;
                    } else
                        T[i].Right=-1;
                }
            }
        }
    
        for(i=0; i<n; i++) {
            if(!check[i]) {
                root=i;
                break;
            }
    
        }
        return root;
    }
    bool Isomorphic(int root1,int root2) {
        if(root1==-1&&root2==-1)//空树,同构
            return true;
        if((root1==-1&&root2!=-1)||(root1!=-1&&root2==-1))//两棵树只有一棵是空树,不同构
            return false;
        if(T1[root1].Data!=T2[root2].Data)//根结点值不等,不同构
            return false;
        if(T1[root1].Left==-1&&T2[root2].Left==-1) { //T1 T2的左子树均空,递归判断T1 T2的右子树
            return Isomorphic(T1[root1].Right,T2[root2].Right);
        }
        if((T1[root1].Left!=-1&&T2[root2].Left!=-1)&&(T1[T1[root1].Left].Data==T2[T2[root2].Left].Data)) //T1 T2左子树均不空且两棵树的左子树的值相等,不用交换左右子树,递归判断
            return Isomorphic(T1[root1].Left,T2[root2].Left)&&Isomorphic(T1[root1].Right,T2[root2].Right);
        else //否则,交换左右子树,递归判断
            return Isomorphic(T1[root1].Right,T2[root2].Left)&&Isomorphic(T1[root1].Left,T2[root2].Right);
    }
    
    int main() {
        int r1=BuildTree(T1);
        int r2=BuildTree(T2);
        if(Isomorphic(r1,r2)) printf("Yes");
        else printf("No");
        return 0;
    }
    勤能补拙,熟能生巧
  • 相关阅读:
    读《人人都是产品经理》
    前端值得看的博客
    git 常用命令 创建查看删除分支,创建查看删除tag等
    看《如何令选择变得更加容易》
    读【失控】——众愚成智
    html5 postMessage
    下拉滚动加载更多数据
    html select用法总结
    分布式系统事务一致性解决方案
    nginx简易教程
  • 原文地址:https://www.cnblogs.com/snzhong/p/12443443.html
Copyright © 2011-2022 走看看