摘要:
1. 根据有序数组生成平衡搜索二叉树 1.1. 问题 给定一个有序数组,生成一个平衡搜索二叉树。 注:平衡二叉树的定义是,对于该二叉树的每个子树,该子树的左子树高度和右子树高度差在1之内。 1.2. 代码 这道题很简单,二分递归即可。 public TreeNode<Integer> buildBS 阅读全文
摘要:
1. 统计完全二叉树的节点数 1.1. 问题 如题。 注:完全二叉树表示二叉树内没有空隙;满二叉树是一种特殊的完全二叉树,其所有的叶子节点均在同一层上。 1.2. 思路 方法一:遍历 最简单的做法:遍历一次。时间复杂度为O(n)。 方法二:高度探查 用高度探查方式的时间复杂度为O(h^2)。 当我们 阅读全文
摘要:
1. 二叉树的序列化、反序列化 1.1. 问题 将一个二叉树序列化为字符串。 从序列化后的字符串重建一棵二叉树。 1.2. 思路 用#表示空节点,用!表示一个节点的结尾。 这道题可以用二叉树的前序遍历、后序遍历、层序遍历来做。 中序遍历不好做,因为给定一个序列后,没办法一下子将根节点找出来。 对于前 阅读全文
摘要:
1. Morris遍历 1.1. 思路 Morris遍历通过利用左子树前序遍历下的最后一个节点的right指针,来做到以时间复杂度为O(n)空间复杂度为O(1)的开销遍历一个二叉树。 1.2. 代码 public static <T> void morrisPre(TreeNode<T> root, 阅读全文
摘要:
1. 二叉树遍历 1.1. 问题 分别用递归、非递归的方式实现二叉树的前序、中序、后序遍历。 1.2. 思路 递归的方式就不用说了,很简单。 对于非递归的方式,我们需要用一个栈来模拟,递归函数的方法嵌套。 非递归的前序遍历还挺容易写出来的,在中序遍历这里我卡壳了。 最后看书,发现是用一个cur游标来 阅读全文