二叉树题目_1

不懂可以给我留言,虽然我也很菜,也可以看我在**二叉树基础最后面给的视频,都有**

题目1

题目如图:
二叉树题目_1_第1张图片
这个题目的规律(记住就行)

  • 如果一个节点node,如果它有右子树(也就是右节点),那么node节点的后继结点一定是它右子树中最左的节点.

  • 如果一个节点node,如果它没有右子树(也就是右节点),那么node节点的后继结点就要通过node节点找到它的父指针,如果该节点node是它父节点的右孩子,就继续往上找,直到某个节点是其父节点的左孩子,那么这个父节点就是node节点的后继结点.

  • 举例
    二叉树题目_1_第2张图片
    题目1_找后继结点代码

题目2

其实也就是题目1的扩展,其余条件和题目1都一样,不过这里是找给定节点的先驱节点

思路(跟题目1的思路刚好相反):

  • 思路1: 如果有左子树的话,找到左子树的最右边的节点.

  • 思路2: 如果没有左子树的话,一直往父节点找,直到找到某个节点是其父节点的右节点,那么这个父节点就是要找的节点.

题目2代码

题目3

二叉树的序列化(持久化)和反序列化

意思就是我们建立二叉树这些操作都是在内存里进行的,但是当我们一关机,这些记录就没了,我们怎么才能将它保存到文件中持久化存储呢?这就需要用到序列化和反序列化了,我写过一篇博客专门介绍序列化和反序列化: 序列化和反序列化

二叉树的序列化可以把它遍历后变成字符串然后保存到文件中,为空就用特殊符号表示就好了.

通过先序遍历

  • 先序遍历按遍历节点顺序实现序列化
  • 就是当我每次遍历到一个节点的时候,我就用节点值+"“保存到字符串中,不断遍历,然后做一个字符串的拼接,null就用”#"表示.
  • 先序遍历实现反序列化
  • 就是我们怎么序列化的就怎么反序列化,将字符串通过_分割可以形成一个数组,然后在遍历数组的过程中重建二叉树.
  • 先序遍历序列化和反序列化代码

  • 按层实现序列化和反序列化代码

题目4

题目: 判断一棵树是否是平衡二叉树

  • 啥叫平衡二叉树?
  • 平衡二叉树是指对于该二叉树的的任意节点,它的左子树和右子树的高度差不超过1.

  • 注意:

  • 这里需要区分一下高度和深度,高度是从下往上数,深度是从上往下数,我在这里引用一下别人的博客:二叉树高度和深度的区别.

  • 还有就是二叉树的层,是从1开始的,比如满二叉树有3个节点,那么就是两层.

  • 思路: 如果把每个节点都作为根节点的树都是平衡的,那这棵树就是平衡的,我们先去判断根节点的左子树和右子树是否是平衡二叉树,有任意一个不是平衡二叉树,就直接返回false,如果左右子树都是平衡二叉树,返回true,不是就返回false.

  • 对于这类二叉树问题有套路思路,就是在这里学会用递归函数来写代码,递归函数就是不断压栈弹栈的过程嘛,而且递归会回到每个节点三次(来到node,去node的左子树和右子树转一圈再回来node),那么我们可以收集其左右子树的信息,然后回到其父节点的时候加以判断,拿这道题来说,我们可以通过判断左右子树是否是平衡二叉树来判断整棵树是否是平衡二叉树.

  • 平衡二叉树举例如图:
    二叉树题目_1_第3张图片

  • 判断是否是平衡二叉树代码

  • 我写的可能不清楚,不懂的话就去看我给的视频: 二叉树基础中给的左神的视频,很牛逼

题目5

判断一棵树是否是搜索二叉树

搜索二叉树

  • 什么是搜索二叉树?
  • 二叉搜索树是指对于二叉树的任意一个节点作为头节点的子树来说,它的左子树的所有节点都比它小,右子树的所有节点都比它大.
  • 怎么判断是否是搜索二叉树呢?
  • 一般来说搜索二叉树是不会出现重复节点的(重复节点可以压缩到一个节点里),所以我们对该二叉树进行遍历,当它的中序遍历结果是升序的,那么这棵树就是搜索二叉树.我们这里用非递归方法写,递归版的写不出来
  • 判断是否是搜索二叉树代码

题目6

完全二叉树

  • 什么是完全二叉树?
  • 完全二叉树这个概念我在二叉树基础那里有写:**二叉树基础,**它是相对于满二叉树来说的,只有倒数两层不满,而且都是从左开始往右放.
  • 如何判断一棵树是否是完全二叉树呢?
  • 我们通过二叉树按层遍历
  1. 如果一个节点有右孩子没有左孩子,一定不是完全二叉树!

  2. 第一种情况通过了的话,再看如果一个节点不是有两个孩子(即有左没右或者左右都没有,有右没左的情况在情况1就判断了),那么它后面的节点一定都是叶子节点,否则一定不是完全二叉树.

  3. 第一种和第二种情况都通过了,那这棵树一定是完全二叉树.

  4. 我们可以通过一个布尔类型的变量来控制是否已经到了情况2,比如说没到情况2的时候,让布尔值为false,当通过了情况2之后,跑后面的节点的时候,让布尔值为true,告诉虚拟机后面的节点都必须是叶子节点了,都不能有孩子了!

  • 完全二叉树代码.
  • 完全二叉树举例
    二叉树题目_1_第4张图片

题目7

已知一棵完全二叉树,求其节点的个数,要求时间复杂度低于O(N),N为这棵树的节点个数

一个满二叉树有n层(n从1开始,即根节点就是第一层),那么它的节点数为2^n - 1.

思路(这个思路时间复杂度为O(logN^2)):

  • 整棵树先遍历到根节点最左边的叶子节点,就是跟中序遍历一样先左边跑完,因为完全二叉树肯定是先左边堆满才开始往右边堆,所以,左边的深度就是整棵树的深度h,此时时间复杂度为O(logN).

  • 然后再跑根节点的右子节点的左边界,跑完看它有没有到最后一层,此时时间复杂度也为O(logN)

  • 如果到了最后一层,那说明根节点的左子树是满的,左子树的深度自然也就出来了,那就是根节点的深度-1,其总共的节点是2^(h-1) - 1,此时因为右子树也同样是一个完全二叉树,让它去递归这个过程.

  • 如果没有到最后一层,那说明右子树肯定比左子树少一层,而且是满的,那这样它的节点数就可以求了,为2^(h-1-1) - 1,此时我们再对左树递归这个过程.

  • 例子如图:
    二叉树题目_1_第5张图片
    完全二叉树节点代码_人家这思路绝了.

你可能感兴趣的:(算法)