树的同构
时间:2019-08-28
本文章向大家介绍树的同构,主要包括树的同构使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 题目描述
- C语言实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#define MaxSize 100
typedef char ElementType;
struct TNode
{
ElementType Elem;
int Left;
int Right;
}T1[MaxSize],T2[MaxSize];
int BuildeTree(struct TNode T[])
{
int N;
int Root = -1;
int i = 0;
char cl, cr;
int check[MaxSize];
scanf("%d\n",&N);
if (N != 0)
{
for (i = 0;i < N;i++)
{
check[i] = 0;
}
for (i = 0;i < N;i++)
{
scanf("%c %c %c\n",&T[i].Elem,&cl,&cr);
if (cl != '-')
{
T[i].Left = cl - '0';
check[T[i].Left] = 1;
}
else
{
T[i].Left = -1; //-1表示没有子节点
}
if (cr != '-')
{
T[i].Right = cr - '0';
check[T[i].Right] = 1;
}
else
{
T[i].Right = -1; //-1表示没有子节点
}
}
for (i = 0; i < N;i++)
{
if (!check[i])
{
Root = i;
break;
}
}
}
return Root;
}
bool Isomorphism(int R1,int R2)
{
//先对基本情况进行判断
if (R1 == -1 && R2 == -1)
{
return true; //两颗树都是空树,一定同构
}
if ((R1 == -1 && R2 != -1)
||(R1 != -1 && R2 == -1))
{
return false; //一颗为空树 另一个颗不是空树 一定不同构
}
if (T1[R1].Elem != T2[R2].Elem)
{
return false; //两颗树的根节点不相同 必定不同构
}
if (T1[R1].Left == -1 && T2[R2].Left == -1)
{
Isomorphism(T1[R1].Right, T2[R2].Right); //左子树为空 则判断其右子树
}
if ((T1[R1].Left != -1 && T2[R2].Left != -1) &&
(T1[T1[R1].Left].Elem == T2[T2[R2].Left].Elem))
{
//不用交换左右子树
return (Isomorphism(T1[R1].Left,T2[R2].Left) && Isomorphism(T1[R1].Right, T2[R2].Right));
}
else
{
//需要交换左右子树
return (Isomorphism(T1[R1].Left, T2[R2].Right) && Isomorphism(T1[R1].Right, T2[R2].Left));
}
}
int main()
{
int R1, R2;
R1 = BuildeTree(T1);
R2 = BuildeTree(T2);
if (Isomorphism(R1,R2))
{
printf("Yes");
}
else
{
printf("No");
}
// system("pause");
return 0;
}
值得一提的是,这道题目也是用递归的思想来解决。
原文地址:https://www.cnblogs.com/Manual-Linux/p/11425124.html
- SQl 语句(常见) 新建,删除,修改表,新增字段,修改默认值
- SQL处理表结构的基本方法整理(创建表,关联表,复制表)
- Go web之旅(路由篇)
- Golang插入排序
- Golang写的并行排序算法
- Go中调用dll示例
- python 序列化数据:pickle与json ,dumps与loads
- golang继承,和多态
- python 利用random生成验证码与MD5码加密过程
- Java内部类的继承
- Java继承类中static成员函数的重写
- Search for a range寻找上下界-Leetcode
- Basic Calculator 基本计算器-Leetcode
- python yield函数深入浅出理解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Koa - 中间件(理解中间件、实现一个验证token中间件)
- Koa - 使用koa-multer上传文件(上传限制、错误处理)
- 原生js 复制内容到剪切板
- Vue - watch高阶用法
- 小程序如何支持使用 async/await (构建npm版)
- require.context批量引入文件
- Node笔记 - process.cwd() 和 __dirname 的区别
- 小程序如何支持使用 async/await
- 小程序 - 如何自定义导航栏
- protobuf 语法 与 protocol-buffers 的使用
- 小程序 - 简单实现mixin功能
- 记录一些小技巧-CSS篇
- 记录一些小技巧-JS篇
- 初次在Vue项目使用TypeScript,需要做什么
- VScode - 10个提高工作效率的快捷键