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