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

题目(二叉树)

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

题目(二叉树)

1、把一棵二叉树转换为它的镜像树

//  转换成镜像树
void mirror_tree(TreeNode* root)
{
	if(NULL == root)	return;
	
	TreeNode* temp = root->left;
	root->left = root->right;
	root->right = temp;

	mirror_tree(root->left);
	mirror_tree(root->right);
}

2、输入两棵二叉树A、B,判断B是不是A的子结构(我们约定空树不是任意一棵树的子结构)

//  判断两棵树
bool treecmp(TreeNode* r1,TreeNode* r2)
{
	if(NULL == r1 && NULL == r2)	return true;
	if(NULL != r1 && NULL == r2)	return true;
	if(NULL == r1 && NULL != r2)	return false;

	if(r1->data != r2->data)	return false;
	return treecmp(r1->left,r2->left) && treecmp(r1->right,r2->right);
}

//  子结构
bool is_subtree(TreeNode* rootA,TreeNode* rootB)
{
	if(NULL == rootA)	return false;

	if(rootA->data == rootB->data)
	{
		bool flag = treecmp(rootA,rootB);
		if(flag)	return true;
	}
	bool lflag = is_subtree(rootA->left,rootB);
	bool rflag = is_subtree(rootA->right,rootB);
	return lflag || rflag;
}

3、计算出有序二叉树中倒数第k大的数

bool _access_tree(TreeNode* root,size_t index,int* ptr,int* k)
{
	if(NULL == root)	return false;
	bool lflag = _access_tree(root->right,index,ptr,k);
	if((*k)++ == index)
	{
		*ptr = root->data;
		return true;
	}
	bool rflag = _access_tree(root->left,index,ptr,k);
	return lflag || rflag;
}

4、判断一棵二叉树是否是对称

bool _is_sym(TreeNode* root1,TreeNode* root2)
{
	if(NULL == root1 && NULL == root2)	return true;
	if(NULL == root1 && NULL != root2)	return false;
	if(NULL != root1 && NULL == root2)	return false;
	if(root1->data != root2->data)	return false;

	bool lflag = _is_sym(root1->left,root2->right);
	bool rflag = _is_sym(root1->right,root2->left);
	return lflag && rflag;
}

//  对称
bool is_sym(TreeNode* root)
{
	return _is_sym(root->left,root->right);	
}

5、将一棵有序二叉树转换为一个有序的双向循环链表

//  尾添加链表
void __add_tail_list(TreeNode** head,TreeNode* node)
{
	if(NULL == *head)
	{
		*head = node;
	}
	else
	{
		(*head)->left->right = node;
		node->left = (*head)->left;
	}
	(*head)->left = node;
	//node->right = (*head);
}

void _tree_to_list(TreeNode* root,TreeNode** head)
{
	if(NULL == root)	return;
	//  按照中序遍历树,尾添加到链表中
	_tree_to_list(root->left,head);
	__add_tail_list(head,root);
	_tree_to_list(root->right,head);
}

//  有序二叉树转有序双链表
TreeNode* tree_to_list(TreeNode* root)
{
	//  不带头节点的链表
	TreeNode* head = NULL;
	_tree_to_list(root,&head);
	head->left->right = head;
	return head;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630132.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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