将一棵二叉查找对转换为它的镜像
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/ \ / \
5 7 9 11
输出:
8
/ \
10 6
/ \ /\
11 9 7 5
这个题目没什么难度,关键在于对指针的理解,转换成镜像只需要交换每个节点的左右孩子指针。
下面只把两个函数贴出来,关于创建树,以及栈的操作前面几篇文章已写。
递归算法
只需要10行,recursiveMirrorBST函数
//递归,将二叉查找树转换为它的镜像
void recursiveMirrorBST(BSTreeNode *root)
{
if(root)
{
recursiveMirrorBST(root->left);
recursiveMirrorBST(root->right);
BSTreeNode *p;
p = root->left;
root->left = root->right;
root->right = p;
}
}
非递归的算法
借助栈来完成操作,定义栈需要占用一些体积
//循环,将二叉查找树转换为它的镜像
void loopMirrorBST(BSTreeNode *root)
{
BSTreeNode *p, *q;
Stack *s;
s = (Stack *)malloc(sizeof(Stack));
initStack(s);
push(root,s);
while(s->top > -1)
{
p=pop(s);
if(p->left)
push(p->left, s);
if(p->right)
push(p->right, s);
q = p->left;
p->left = p->right;
p->right = q;
}
}
留下评论