微软面试百题015——镜像翻转BST

1.题目描述

题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5

2.算法思路:

标准的递归思路,我们采用前序遍历的顺序,不断的对树进行翻转,知道遇到空节点为止
奇葩的非递归思路,首先,我们要意识到,递归其实完全可以用栈来进行代替,用辅助栈模拟递归的过程不困难
我们这么来看,我们每一层递归唯一的差别就是操作的根节点的不同,所以说所以说我们的辅助栈保存操作的根节点,直到我们的辅助栈为空说明镜像翻转完成

3.代码示例:

	void mirror(point* p)
		{
			if(p==NULL) return ;
			else
			{
				point* k=p->left;
				p->left=p->right;
				p->right=k;
				mirror(p->left);
				mirror(p->right);
			}
		}
		void mirroranother()
		{
			int num=0;
			stack<point*> mystack;   //辅助栈
			mystack.push(root);
			while(mystack.size()!=0)
			{
				point* k=mystack.top();
				point* help=k->left;
				k->left=k->right;
				k->right=help;
				mystack.pop();
				if(k->left!=NULL) mystack.push(k->left);   //小心这两句防止访问空节点
				if(k->right!=NULL) mystack.push(k->right);
			}
		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值