题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。
分析:前序遍历二叉树每个结点,如果结点不为空,则交换其左右子结点,当遍历完之后,就得到了树的镜像。
#include <stdio.h>
#include <malloc.h>
#include <stack>
using namespace std;
typedef struct node
{
int value;
struct node *left;
struct node *right;
}node,*pnode;
void create_tree(pnode *root)
{
pnode node[7];
int i;
for(i=0;i<7;i++)
{
node[i] = (pnode)malloc(sizeof(node));
if(!node[i])
{
printf("分配空间失败!\n");
return;
}
node[i]->left = NULL;
node[i]->right = NULL;
}
node[0]->value = 8;
node[1]->value = 6;
node[2]->value = 10;
node[3]->value = 5;
node[4]->value = 7;
node[5]->value = 9;
node[6]->value = 11;
node[0]->left = node[1];
node[0]->right = node[2];
node[1]->left = node[3];
node[1]->right = node[4];
node[2]->left = node[5];
node[2]->right = node[6];
*root = node[0];
}
void print_tree(pnode root)//前序遍历
{
if(root==NULL)
return;
printf("%d\t",root->value);
if(root->left != NULL)
print_tree(root->left);
if(root->right != NULL)
print_tree(root->right);
}
void mirror_recursion(pnode root)//递归镜像
{
if(root == NULL)
return;
if(root->left == NULL && root->right == NULL)//只剩一个结点
return;
pnode temp = root->left;
root->left = root->right;
root->right = temp;
if(root->left != NULL)
mirror_recursion(root->left);
if(root->right != NULL)
mirror_recursion(root->right);
}
void mirror(pnode root)//借用stack,迭代镜像
{
if(root == NULL)
return;
stack<pnode> stack_node;
stack_node.push(root);
while(stack_node.size())
{
pnode node = stack_node.top();
stack_node.pop();
pnode temp = node->left;
node->left = node->right;
node->right = temp;
if(node->left!=NULL)
stack_node.push(node->left);
if(node->right!=NULL)
stack_node.push(node->right);
}
}
int main()
{
pnode root;
create_tree(&root);
printf("原二叉树结点为:\n");
print_tree(root);
printf("\n");
mirror_recursion(root);
printf("递归镜像后二叉树结点为:\n");
print_tree(root);
printf("\n");
mirror(root);
printf("迭代镜像后二叉树结点为(还原为原二叉树):\n");
print_tree(root);
printf("\n");
return 0;
}