c语言实现判断两颗树是否同构
2017-04-03 18:56
260 查看
在本题中认为如果两个树左右子树交换可以相同,也被认为是同构树。
对应输入格式为:4(总结点数)
A - 1
B 2 3
C - -
D - -
对应输入格式为:4(总结点数)
A - 1
B 2 3
C - -
D - -
#include <stdio.h> #define Tree int #define Null -1 #define MAXSIZE 10 struct Node{ char Element; Tree Left; Tree Right; }T1[MAXSIZE], T2[MAXSIZE]; Tree BuildTree(struct Node T[]) { int N, i, Root; char ch, cl, cr; scanf("%d", &N); ch = getchar(); int Check ; for(i = 0; i < N; i++) Check[i] = 0; //为了标记根节点 ,因为没有节点指向根节点 for(i = 0; i < N; i++){ scanf("%c %c %c", &T[i].Element, &cl, &cr); ch = getchar(); if(cl != '-'){ T[i].Left = cl - '0'; Check[T[i].Left] = 1; } else T[i].Left = Null; if(cr != '-'){ T[i].Right = cr - '0'; Check[T[i].Right] = 1; } else T[i].Right = Null; } for(i = 0; i < N; i++) //遍历找到根节点 if(Check[i] == 0) break; Root = i; return Root; } int Isomorphic(Tree R1, Tree R2) { //两树都为空 if(R1 == Null && R2 == Null) return 1; //空树和非空树 if((R1 == Null && R2 != Null) || (R1 != Null && R2 == Null)) return 0; //两树的根节点不一样 if(T1[R1].Element != T2[R2].Element) return 0; //若过两树的左子树都空,判断右子树是否一样 if(T1[R1].Left == Null && T2[R2].Left == Null) return Isomorphic(T1[R1].Right, T2[R2].Right); //若两树的左子树不空,并且左子树的结点元素都一样,判断左右子树是否一样 if((T1[R1].Left != Null && T2[R2].Left != Null) && (T1[T1[R1].Left].Element == T2[T2[R2].Left].Element)) return Isomorphic(T1[R1].Left, T2[R2].Left) && Isomorphic(T1[R1].Right, T2[R2].Right); else //否则 判断两树是否同构 return Isomorphic(T1[R1].Left, T2[R2].Right) && Isomorphic(T1[R1].Right, T2[R2].Left); } int main() { Tree R1, R2; R1 = BuildTree(T1); R2 = BuildTree(T2); if(Isomorphic(R1, R2)) printf("Yes"); else printf("No"); return 0; }
相关文章推荐
- c语言实现判断一个数是否是素数
- C语言实现链表之双向链表(十二)判断链表是否为空和获取链表长度
- 判断单链表中是否有环,计算出环的首地址 C语言实现
- LeetCode-Isomorphic Strings:判断两个字符串是否同构(hashtable实现)
- C语言实现利用switch函数判断是否交换输入的数字
- 判断IP及子网掩码是否合法(C语言实现)
- 判断两棵树是否是同构的C语言
- C语言实现链表之单向链表(十二)判断链表是否为空和获取链表长度
- 判断表达式括号是否匹配,C语言堆栈实现
- 用C语言实现判断两个数组中是否有相同的元素,有就输出“有”,没有则输出“没有”
- 链表的初始化、遍历、删除、插入、判断是否为空、求长度 C语言实现
- C语言实现非递归的比较两个二叉树是否同构
- [leetcode]Same Tree(判断两个二叉树是否相等 C语言实现)
- 判断IP及子网掩码是否合法(C语言实现)
- 用C语言实现输入密码以星号显示并判断密码是否正确
- 判断两颗二叉树是否相等-Java实现
- 转:邹建--实现删除主表数据时, 判断与之关联的外键表是否有数据引用, 有标志, 无则删除
- 使用(Filter)过虑器实现对Session是否过时的判断
- javascript实现判断图片地址是否失效
- 实现删除主表数据时, 判断与之关联的外键表是否有数据引用, 有标志, 无则删除