镜像二叉树:根节点的左右孩子交换
所有节点的左右孩子都交换
例如:
递归
递推公式:根节点的左子树和右子树换位置
终止条件:空树
void MirrorTree(BNode *root)
{
if (root == NULL)
{
return;
}
BNode *tmp = root->left;
root->left = root->right;
root->right = tmp;
MirrorTree(root->left);
MirrorTree(root->right);
}
非递归
如果用非递归,就要用到循环和栈,先进后出。
第一步:先将根节点压栈
第二步:保存栈顶元素并出栈
第三步:将栈顶元素的左右孩子换位置
第四步:判断左右孩子是否为空,如果不是空,压栈
注:一定要记得出栈,要不然就会变成死循环
void MirrorTree2(BNode *root)
{
if (root == NULL)
{
return;
}
Stack stack;
StackInit(&stack);
StackPush(&stack, root);
while (!StackEmpty(&stack))
{
BNode *node = StackTop(&stack);
StackPop(&stack);
BNode *tmp = node->left;
node->left = node->right;
node->right = tmp;
if (node->left)
{
StackPush(&stack, node->left);
}
if (node->right)
{
StackPush(&stack, node->right);
}
}
}