《剑指offer》总结二 之二叉树

时间:2019-03-19
本文章向大家介绍《剑指offer》总结二 之二叉树,主要包括《剑指offer》总结二 之二叉树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

17、树的子结构(27ms,5836k)

  • 题目描述:

    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

  • 思路:

    要查找A中是否存在和树B结构一样的子树,分为以下两步:

      1.  第一步:在树A中找到和树B的根结点的值一样的结点R;
    
      2.  第二步:判断树A中以R为根结点的子树是否包含和B一样的结构。

    遍历结点下面的子树,直到树B中的所有结点在树A中某个子树中找到。

  • 代码实现树的子结构

18、二叉树的镜像(38ms)

  • 题目描述:

    操作给定的二叉树,将其变换为源二叉树的镜像。

  • 思路:

    • 二叉树的镜像:即根结点和每个中间结点的左右孩子结点交换位置得到的一棵二叉树。

    • 求镜像的过程:先前序遍历这棵树的每个结点,如果遍历的结点有子结点,就交换它的两个子结点。当交换完所有非叶结点的左、右子结点之后,就得到了树的镜像。

    • 前序遍历:根节点->左子树->右子树.

  • 代码实现二叉树的镜像

24、二叉树中和为某一值的路径(26ms,5728k)

  • 题目描述:

    输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

  • 思路:

    1. 首先用前序遍历的方式访问到某一个结点,我们把该结点添加到路径中,并且累加该结点对应的值。

    2. 如果该结点为叶结点,并且路径上结点的值的和刚好等于输入的整数,则当前路径符合要求。

    3. 如果该结点不是叶结点,则继续访问它的子结点。

    4. 当前结点访问结束后,递归函数将自动回到它的父结点。并且在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是从根结点到父结点。

  • 代码实现二叉树中和为某一值的路径

38、二叉树的深度(26ms,5624k)

  • 题目描述:

    输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

  • 思路:

    如果一个树只有一个根结点,那它的深度为1;如果根结点只有左子树没有右子树,则在它的左子树深度上加1;同样,如果根结点只有右子树没有左子树,则在它的右子树深度上加1;如果根结点既有左子树又有右子树,则该树的深度为左右子树深度的较大值加1.最后将左右子树递归判断其是否右左右子树(即不断计算左右子树的深度)

  • 代码实现二叉树的深度

58、对称的二叉树(26ms,5704k)

  • 题目描述:

    请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

  • 思路:

    • 首生成二叉树的镜像,然后判断该二叉树与二叉树的镜像的每个结点是否相等,如果完全相等,则该二叉树为对称的。

    • 将该二叉树与其本身是否对称作判断,首先,判断二叉树中的某个结点的左右孩子结点是否对称(即值是否相等),然后递归判断左结点的右孩子(左孩子)结点与右结点的左孩子(右孩子)结点是否对称。

  • 代码实现对称的二叉树

参考

  1. 《剑指offer》宝典神功

  2. 牛客网:https://www.nowcoder.com/ta/coding-interviews