zoukankan      html  css  js  c++  java
  • 二叉树的镜像

    题目:二叉树的镜像

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

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

     

    解题步骤:

    交换根节点的两个子结点之后,我们注意到值为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.

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

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

     

    代码如下:

     

  • 相关阅读:
    【BZOJ3533】向量集(SDOI2014)-线段树+凸壳+二分
    【BZOJ4869】相逢是问候(六省联考2017)-扩展欧拉定理+线段树
    【BZOJ4012】开店(HNOI2015)-动态点分治+set
    【BZOJ1095】捉迷藏(ZJOI2007)-动态点分治+堆
    【BZOJ2299】向量(HAOI2011)-裴蜀定理
    【BZOJ4942】整数(NOI2017)-线段树+压位
    【BZOJ3594】方伯伯的玉米田(SCOI2014)-DP+二维树状数组
    背包DP专题
    【2018.11.7】【luoguNOIp 热身赛】解题报告及总结
    【一天一DP计划】状压DP
  • 原文地址:https://www.cnblogs.com/zhibei/p/9209521.html
Copyright © 2011-2022 走看看