博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的镜像
阅读量:7123 次
发布时间:2019-06-28

本文共 999 字,大约阅读时间需要 3 分钟。

题目:二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出他的镜像。

树的镜像对很多人来说是一个新的概念,如下图所示:

 

 

解题步骤:

交换根节点的两个子结点之后,我们注意到值为10,6的结点的子结点仍然保持不变,因此我们还需要交换这两个结点的左右子结点。交换之后的结果分别如下图中的第三棵树和第四棵树。做完这两次交换之后,我们已经遍历完所有的非叶子结点。此时交换之后的树刚好就是原始树的镜像。

 

 

注:(a)交换根结点的左右子树;(b)交换值为10的系欸但的左右子结点;(c)交换值为6的结点的左右子结点。

总结上面的过程,我们得出求一棵树的镜像过程:我们先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就叫唤它的两个子结点。当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。

 

题目:顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序一次打印出每一个数字。例如:如果输入如下矩阵:

 

 

解题思路:

当我们遇到一个复杂问题的时候,可以用图像来帮助我们思考。由于是以从外圈到内圈的顺序一次打印,我们可以把矩阵想象成若干个圈,如图所示:

 

 

接下来分析循环结束的条件,假设这个矩阵的行数rows,列数是columns。打印第一圈的左上角的坐标是(1,1),第二圈的左上角的坐标是(2,2),以此类推。我们注意到,左上角的坐标中行标和列标总是相同的,于是,可以在矩阵中选取左上角为(start,start)的一圈作为我们分析的目标。

对一个5*5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2,2).我们发现5>2*2.对一个6*6的矩阵而言,最后一圈有4个数字,其左上角的坐标仍然为(2,2),我们发现6>2*2依然成立。于是我们可以得出,让循环继续的条件是columuns>startX*2并且rows>startY*2.

接着我们考虑如何打印一圈的功能,我们可以把打印一圈分为四步:第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列。每一步我们根据起始坐标和终止坐标用一个循环就能打印出一行或者一列。

不过值得注意的是,最后一圈有可能退化成只有一行、只有一列,甚至只有一个数字,因此打印这样的一圈就不再需要四步。如下几个退化模型:

 

 

代码如下:

 

 

转载于:https://www.cnblogs.com/zhibei/p/9209521.html

你可能感兴趣的文章
UVa 10190 - Divide, But Not Quite Conquer!
查看>>
在VirtualBox安装OS X 10.10
查看>>
div 居中
查看>>
Scala 深入浅出实战经典 第65讲:Scala中隐式转换内幕揭秘、最佳实践及其在Spark中的应用源码解析...
查看>>
UIKit的手风琴菜单,单条展开和多条同时展开
查看>>
Entity Framework 学习总结之一:ADO.NET 实体框架概述
查看>>
缺少动态连接库.so--cannot open shared object file: No such file or directory
查看>>
Myeclipse 10/2014 配置插件(svn、maven、properties、velocity)方法
查看>>
emacs quick open and jump file (or buffer) which name is current word
查看>>
(二) 第十二回:廊前无心曲动人 场边有意文偏心【林大帅作品】
查看>>
理解SVG的图形填充规则
查看>>
在Android下运行Linux平台编译的程序
查看>>
C语言中getch()、getche()和getchar()
查看>>
如何调试 Android 上 HTTP(S) 流量
查看>>
这么多开源框架,该用哪个好?
查看>>
Android onTouch、OnLongClick、onClick和ScrollView滑动事件冲突
查看>>
Chromium Graphics: GPUclient的原理和实现分析之间的同步机制-Part II
查看>>
倒车流程2
查看>>
Oracle 12C -- plug unplugged PDB into CDB
查看>>
php多进程编程相关资料(以备参考)
查看>>