浙大数据结构C++实现,写的一塌糊涂到处借鉴,,最后的逻辑也看不懂,有需要改正的地方请指出,不胜感激

#pragma once
#include<iostream>
using namespace std;template<class T>
class Node {
public:T data;int left;int right;
public:Node() :data(0), left(-1), right(-1) {};Node(T d, int l, int r) : data(d), left(l), right(r) {};Node& operator=(Node& n) {this->data = n.data;this->left = n.left;this->right = n.right;return *this;}
};
template<class T>
class Stalinktree {
public:Stalinktree() : m_len(0), m_maxsize(10) {this->m_arrptr = new Node<T>[this->m_maxsize];}int Bulidtree(Node<T>* nodearrptr);int judge(Stalinktree<T> st1,Stalinktree<T> st2, int r1, int r2);public:int m_maxsize;int m_len;Node<T>* m_arrptr;};template<class T>
int Stalinktree<T>::Bulidtree(Node<T>* nodearrptr) {int temp_len;cin >> temp_len;int*check = new int[temp_len];for (int i = 0; i < temp_len; i++) {check[i] = 0;}for (int i = 0; i < temp_len; i++) {T temp_data;int temp_left;int temp_right;cin >> temp_data >> temp_left >> temp_right;Node<T> temp_n(temp_data, temp_left, temp_right);nodearrptr[i] = temp_n;if (nodearrptr[i].left != -1) {check[nodearrptr[i].left] = 1;}if (nodearrptr[i].right != -1) {check[nodearrptr[i].right] = 1;}}this->m_len = temp_len;for (int i = 0; i < temp_len; i++) {if (!check[i]) {return i;}}delete[] check;return -1;}template<class T>
int Stalinktree<T>::judge(Stalinktree<T> st1 ,Stalinktree<T> st2, int r1, int r2) {///*int r1 = st1.Bulidtree(st1.m_arrptr);int r2 = st2.Bulidtree(st2.m_arrptr);*///Buildtre应该是在judge调用之前就已经完成的if (r1 == -1 && r2 == -1) {//两树都是空return 1;}if ((r1 != -1 && r2 == -1) || (r1 == -1 && r2 != -1)) {//有一个非空return 0;}if (st1.m_arrptr[r1].data != st2.m_arrptr[r2].data) {return 0;}//两个树都是存在的,并且值相等,开始递归判断子树if ((st1.m_arrptr[r1].left == -1) && (st2.m_arrptr[r2].left == -1)) {// 此时左子树都为空//return judge(*st1.m_arrptr[st1.m_arrptr[r1].right], *st2.m_arrptr[st2.m_arrptr[r2].right]);。。。//如何实现递归调用右子树判断return judge( st1, st2, st1.m_arrptr[r1].right, st2.m_arrptr[r2].right);}//左子树存在,继续判断if ((st1.m_arrptr[r1].left != -1) && (st2.m_arrptr[r2].left != -1)&& (st1.m_arrptr[st1.m_arrptr[r1].left].data) == (st1.m_arrptr[st2.m_arrptr[r2].left].data)){    // 此时左子树都非空//并且左子树的值相等// 看不懂return (judge(st1, st2, st1.m_arrptr[r1].left, st2.m_arrptr[r2].left) && judge(st1, st2, st1.m_arrptr[r1].right, st2.m_arrptr[r2].right));}else {//判断是不是左右同构return judge(st1, st2, st1.m_arrptr[r1].left, st2.m_arrptr[r2].left)&& judge(st1, st2, st1.m_arrptr[r1].right, st2.m_arrptr[r2].right);}
}
#include"staticlinktree.hpp"
using namespace std;void test01() {//Linktree<int> lt1;Stalinktree<char>* slt1 = new Stalinktree<char>();int r1 = slt1->Bulidtree(slt1->m_arrptr);Stalinktree<char>* slt2 = new Stalinktree<char>();int r2 = slt2->Bulidtree(slt2->m_arrptr);cout << slt1->judge(*slt1, *slt2, r1, r2) << endl;
}int main() {test01();system("pause");return 0;
}

C++实现二叉树同构相关推荐

  1. Isomorphic:二叉树同构

    如果T1可以通过交换T1中(一些)节点的左右子节点来转换为T2,则T1和T2这两棵树是同构的.例如,图1中的两棵树是同构的,因为如果交换了A.B和G的子节点,而不是其他节点,则它们是相同的.给出一个多 ...

  2. 递归法进行二叉树同构判定

    #include<stdio.h> #define MaxTree 100 #define ElementType char #define Tree int//定义一个树的结构体,这里采 ...

  3. 判断两棵二叉树是否同构,三种实现方式(递归、队列、堆栈)

    一.同构的概念: 给定两棵二叉树 T1 和 T2,如果T2可以通过若干次左右孩子互换就变成T1,那么我们称这两棵树是同构的 例1:下图两棵树同构,因为对T2,交换A左右孩子:交换B左右孩子,交换G左右 ...

  4. 树根c语言,03-树1 树的同构 (C语言链表实现)

    #include #include #include #include typedef char ElemType; typedef struct BinTree { ElemType data; s ...

  5. 树的同构(c语言静态链表实现)

    题目 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子 ...

  6. 数据结构和算法面试题系列—二叉树面试题汇总

    这个系列是我多年前找工作时对数据结构和算法总结,其中有基础部分,也有各大公司的经典的面试题,最早发布在CSDN.现整理为一个系列给需要的朋友参考,如有错误,欢迎指正.本系列完整代码地址在 这里. 0 ...

  7. 六大类二叉树面试题汇总解答

    0 概述 继上一篇总结了二叉树的基础操作后,这一篇文章汇总下常见的二叉树相关面试题,主要分为判断类.构建类.存储类.查找类.距离类.混合类这六类大问题. 本文所有代码 https://github.c ...

  8. 二叉树的二叉链表表示与基本操作

    二叉树的二叉链表表示与基本操作(伪代码详细注释版,含源码) 一.二叉链表表示法 1. 二叉树 2. 二叉链表 二.二叉树的遍历(输出结点) 1. 层次遍历 2. 先序.中序.后序遍历(递归算法) 3. ...

  9. 2.3 树的同构(树,c)

    树的同构 树的同构 输入格式: 输出格式: 输入样例1(对应图1): 输出样例1: 输入样例2(对应图2): 输出样例2: 题意理解 输入两棵二叉树的信息,判断是否同构(对应图1) 求解思路 二叉树表 ...

  10. 03-树1 树的同构

    题目 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子 ...

最新文章

  1. linux下shell命令trap
  2. 转载:k2pdfopt详细教程-让kindle看遍所有pdf
  3. python遍历指定文件夹的所有文件_python 统计指定文件夹下所有的文件数量,BFS方式...
  4. poj 1470(简单LCA 倍增法)
  5. art-template-loader:template
  6. python re模块下载_python re模块详解
  7. 贝叶斯公式的个人理解
  8. mysql 分表 sphinx_sphinx(coreseek)处理分表的方案
  9. c++ 类和对象的内存管理
  10. sql server 群集_SQL Server群集索引概述
  11. linux内核之时间子系统
  12. 第五讲 C#中的异常处理
  13. 《未来世界的幸存者》笔记
  14. 高仙与吾尚联合打造“人+机+纳米材料”石材养护新模式 首批60落地上海环球港
  15. vue spa项目转服务器渲染
  16. xinxin- 新鑫牌计算器
  17. 关于各类技术外包项目的那些事儿
  18. golang转换时间格式报missing Location in call to Date
  19. V2X-ViT:基于Vision Transformer的V2X协同感知
  20. java 实例化list_java中List的用法和实例详解

热门文章

  1. 全文检索——Lucene
  2. ubuntu自带Firefox安装flash插件
  3. PQI Air Card:自带Wi-fi的闪存卡 即时分享精彩画面
  4. disparity和parallax的区别
  5. DVWA Contradiction #01
  6. Linux不能连接蓝牙音箱,【搁浅St|开发日记】彻底解决dueros连接蓝牙音箱的问题...
  7. 计算机中基本磁盘分为几个区,电脑硬盘分几个区最好?电脑硬盘分区教程
  8. JavaScript Navigator
  9. BP神经网络的非线性曲线拟合和预测(未完)
  10. U盘全新安装High sierra及打造mac,win10双系统