栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++实现二叉树同构

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实现二叉树同构

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

#pragma once
#include
using namespace std;

template
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 Stalinktree {
public:
	Stalinktree() : m_len(0), m_maxsize(10) {
		this->m_arrptr = new Node[this->m_maxsize];
	}
	int Bulidtree(Node* nodearrptr);
	int judge(Stalinktree st1,Stalinktree st2, int r1, int r2);

public:
	int m_maxsize;
	int m_len;
	Node* m_arrptr;

};

template
int Stalinktree::Bulidtree(Node* 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 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
int Stalinktree::judge(Stalinktree st1 ,Stalinktree st2, int r1, int r2) {
	//
	//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 lt1;
	Stalinktree* slt1 = new Stalinktree();
	int r1 = slt1->Bulidtree(slt1->m_arrptr);
	Stalinktree* slt2 = new Stalinktree();
	int r2 = slt2->Bulidtree(slt2->m_arrptr);
	cout << slt1->judge(*slt1, *slt2, r1, r2) << endl;
}

int main() {
	test01();
	system("pause");
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/861825.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号