二叉树的镜像--递归和迭代分别实现

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。

分析:前序遍历二叉树每个结点,如果结点不为空,则交换其左右子结点,当遍历完之后,就得到了树的镜像。

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include <stack>  
  4. using namespace std;  
  5.   
  6. typedef struct node  
  7. {  
  8.     int value;  
  9.     struct node *left;  
  10.     struct node *right;  
  11. }node,*pnode;  
  12.   
  13. void create_tree(pnode *root)  
  14. {  
  15.     pnode node[7];  
  16.     int i;  
  17.     for(i=0;i<7;i++)  
  18.     {  
  19.         node[i] = (pnode)malloc(sizeof(node));  
  20.         if(!node[i])  
  21.         {  
  22.             printf("分配空间失败!\n");  
  23.             return;  
  24.         }  
  25.         node[i]->left = NULL;  
  26.         node[i]->right = NULL;  
  27.     }  
  28.   
  29.     node[0]->value = 8;  
  30.     node[1]->value = 6;  
  31.     node[2]->value = 10;  
  32.     node[3]->value = 5;  
  33.     node[4]->value = 7;  
  34.     node[5]->value = 9;  
  35.     node[6]->value = 11;  
  36.   
  37.     node[0]->left = node[1];  
  38.     node[0]->right = node[2];  
  39.     node[1]->left = node[3];  
  40.     node[1]->right = node[4];  
  41.     node[2]->left = node[5];  
  42.     node[2]->right = node[6];  
  43.   
  44.     *root = node[0];  
  45. }  
  46.   
  47.   
  48. void print_tree(pnode root)//前序遍历  
  49. {  
  50.     if(root==NULL)  
  51.         return;  
  52.     printf("%d\t",root->value);  
  53.     if(root->left != NULL)  
  54.         print_tree(root->left);  
  55.     if(root->right != NULL)  
  56.         print_tree(root->right);  
  57. }  
  58.   
  59. void mirror_recursion(pnode root)//递归镜像  
  60. {  
  61.     if(root == NULL)  
  62.         return;  
  63.     if(root->left == NULL && root->right == NULL)//只剩一个结点  
  64.         return;  
  65.   
  66.     pnode temp = root->left;  
  67.     root->left = root->right;  
  68.     root->right = temp;  
  69.   
  70.     if(root->left != NULL)  
  71.         mirror_recursion(root->left);  
  72.     if(root->right != NULL)  
  73.         mirror_recursion(root->right);  
  74. }  
  75.   
  76. void mirror(pnode root)//借用stack,迭代镜像  
  77. {  
  78.     if(root == NULL)  
  79.         return;  
  80.     stack<pnode> stack_node;  
  81.     stack_node.push(root);  
  82.     while(stack_node.size())  
  83.     {  
  84.         pnode node = stack_node.top();  
  85.         stack_node.pop();  
  86.         pnode temp = node->left;  
  87.         node->left = node->right;  
  88.         node->right = temp;  
  89.         if(node->left!=NULL)  
  90.             stack_node.push(node->left);  
  91.         if(node->right!=NULL)  
  92.             stack_node.push(node->right);  
  93.     }  
  94. }  
  95.   
  96. int main()  
  97. {  
  98.     pnode root;  
  99.     create_tree(&root);  
  100.     printf("原二叉树结点为:\n");  
  101.     print_tree(root);  
  102.     printf("\n");  
  103.     mirror_recursion(root);  
  104.     printf("递归镜像后二叉树结点为:\n");  
  105.     print_tree(root);  
  106.     printf("\n");  
  107.     mirror(root);  
  108.     printf("迭代镜像后二叉树结点为(还原为原二叉树):\n");  
  109.     print_tree(root);  
  110.     printf("\n");  
  111.     return 0;  
  112. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值