解题思路:
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("\n%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 T2左子树均不空 if(T1[T1[root1].Left].Data==T2[T2[root2].Left].Data)//两棵树的左子树的值相等,不用交换左右子树,递归判断 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; }
原文地址:https://www.cnblogs.com/snzhong/p/12443443.html
时间: 2024-11-08 13:11:44