用队列queue实现搜索二叉树的层序遍历、求树高度、求树的镜像树

 是需要一层一层处理的问题二叉树的问题,都可以借助一个队列来实现。

 

/*  给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点) */
single_list_node* LevelOrder_Walk_With_Queue(bstNode* root)
{
	queue* qu = CreateQueue();
	single_list_node* head = NULL;
	bstNode* p = root;

	if(NULL == p)
	{
		return NULL;
	}

	EnQueue(qu, root);
	p = root;
	while( !QueueIsEmpty(qu) )
	{
		p = DeQueue(qu);
		if(p->left != NULL)
		{
			EnQueue(qu, p->left);
		}
		if(p->right != NULL )
		{
			EnQueue(qu, p->right);
		}
		head = SingleList_insertTail(head, p);
	}
	return head;
}
/* 求树高度  */
int Get_High_BST(bstNode* root)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
{
	stack *qu = CreateQueue();
	int high = 0, level_len = 0, tmp =0;
	bstNode* p = NULL;

	if(NULL == root)
	{
		return 0;
	}
	
	EnQueue(qu, root);
	level_len = 1;
	while( !QueueIsEmpty(qu) )
	{
		while(level_len > 0)
		{
			p = DeQueue(qu);
			if( NULL != p->left )
			{
				++tmp;
				EnQueue(qu, p->left );
			}
			if( NULL != p->right )
			{
				++tmp;
				EnQueue(qu, p->right );
			}
			--level_len;
		}
		level_len = tmp ;
		tmp = 0;
		++high;
	}
	printf("\nBST high is %d\n\n", high);
	return high;
}

bstNode* Transfer_Mirror_Tree(bstNode* root)
{
	bstNode* p = root, *lp = NULL, *rp = NULL;
	int level_len = 0, tmp = 0, high = 0;
	queue* qu = CreateQueue();

	if(NULL == root)
	{
		return p;
	}

	EnQueue(qu, root);
	level_len = 1;
	while( !QueueIsEmpty(qu) )
	{
		while(level_len > 0)
		{
			p = DeQueue(qu);
			if(NULL != p->left)
			{
				++tmp;
				EnQueue(qu, p->left);
			}
			if(NULL != p->right)
			{
				EnQueue(qu, p->right);
				++tmp;
			}
			--level_len;

			if(p->left != NULL  || p->right != NULL)
			{
				lp = p->left;
				p->left = p->right;
				p->right = lp;
			}
		}
		level_len = tmp;
		tmp = 0;
		++high;
	}


	return root;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值