题目(二叉树)

本文介绍了关于二叉树的几种操作,包括将二叉树转换为镜像树、判断一棵树是否是另一棵树的子结构、在有序二叉树中查找倒数第k大的数、判断二叉树是否对称以及将有序二叉树转化为双向循环链表。此外,还提供了使用两个栈按之字形打印二叉树的方法。
摘要由CSDN通过智能技术生成

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;
}

6、通过一个函数,把一棵二叉树按照之字型打印,记第一层从左往右打印,第二层从右往左打印,第三层又从左往右打印,以此类推。【使用两个栈】
注意:下面代码要使用需要栈的文件

void Z_show(TreeNode* root)
{
	ListStack* s1 = create_list_stack();
	ListStack* s2 = create_list_stack();
	push_list_stack(s1,root);

	while(!empty_list_stack(s1) || !empty_list_stack(s2))
	{
		while(!empty_list_stack(s1))
		{
			TreeNode* node = top_list_stack(s1);
			pop_list_stack(s1);
			printf("%d "node->data);
			if(node->left)	push_list_stack(s2,node->left);
			if(node->right)	push_list_stack(s2,node->right);
		}
		while(!empty_list_stack(s2))
		{
			TreeNode* node = top_list_stack(s2);
			pop_list_stack(s2);
			printf("%d ",node->data);
			if(node->right)	push_list(s1,node->right);
			if(node->left)	push_list_stack(s1,node->left);
		}
	}
	destory_list_stack(s1);
	destory_list_stack(s2);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LJIEIJL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值