二叉树的镜像
2015-06-17 21:11
253 查看
【题目】
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
【分析】
镜像概念:犹如人照镜子一般,二叉树的镜像,就是将镜像二叉树与原二叉树对折可以重合的意思,如下:
实现方法:
一层一层向下遍历每个根节点,将根节点下的左右孩子交换位置。
从根节点开始,交换其左右孩子6和7,以7为根节点的子树结构和以6为根节点的子树结构完全交换后,递归操作左子树和右子树,如图所示。
【测试代码】
【测试结果】
测试例中二叉树:
测试特殊输入:空树
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
【分析】
镜像概念:犹如人照镜子一般,二叉树的镜像,就是将镜像二叉树与原二叉树对折可以重合的意思,如下:
实现方法:
一层一层向下遍历每个根节点,将根节点下的左右孩子交换位置。
从根节点开始,交换其左右孩子6和7,以7为根节点的子树结构和以6为根节点的子树结构完全交换后,递归操作左子树和右子树,如图所示。
【测试代码】
#include<stdio.h> #include<stdlib.h> typedef struct BinaryTreeNode { char data; struct BinaryTreeNode *left; struct BinaryTreeNode *right; }Node; void create(Node **T) { char ch; scanf("\n%c",&ch); if(ch == '#') *T = NULL; else { *T = (Node *)malloc(sizeof(Node)); (*T)->data = ch; create(&(*T)->left); create(&(*T)->right); } } void mirror_tree(Node **root) { if((*root) == NULL) return ; if((*root)->left ==NULL && (*root)->right == NULL) return ; Node *temp = (*root)->left; (*root)->left = (*root)->right; (*root)->right = temp; if((*root)->left) mirror_tree(&(*root)->left); if((*root)->right) mirror_tree(&(*root)->right); } void pre_visit(Node **root) { if((*root) == NULL) { printf("no data, are you kidding me?"); return; } else { printf("%c",(*root)->data); pre_visit(&(*root)->left); pre_visit(&(*root)->right); } } void main() { Node * root = NULL; printf("二叉树前序遍历创建:\n"); create(&root); printf("\n"); mirror_tree(&root); printf("二叉树的镜像树前序遍历结果为:\n"); pre_visit(&root); printf("\n"); }
【测试结果】
测试例中二叉树:
测试特殊输入:空树
相关文章推荐
- laravel, Composer和autoloading
- stm32 DAC输出音频
- iPhone6和iPhone6 Plus和iPhone5s屏幕尺寸,分辨率,密度 对比
- C++ 中拷贝构造函数被调用情况
- 第15周-项目3-max带来的冲突
- 用户调研(补)
- 阿里云nginx创建多站点
- Mysql 5.6 双主互备高可用(Keepalived+mysql) (一)
- hadoop 创建用户及hdfs权限,hdfs操作等常用shell命令
- Java编程规范
- oracle11g字符集问题之一
- 返回一个二维整数数组中最大联通子数组的和
- Java并发编程-21-在执行器中分离任务的启动与结果的处理
- POJ3278 使用BFS解决问题
- 浅谈BroadcastReceiver的用法
- win7用户组与权限
- hdu3709 Balanced Number(数位dp)
- php mysqli 扩展学习
- StoryBoard页面联线跳转已经页面之间传参数
- 阅读《构建之法》第13~17章及读《一个程序员的生命周期》感想