a搜索二叉树:左子树小于根节点,右子树大于根节点。
平衡树:左右子树高度差不大于1
一般解决二叉树的问题采用递归以及递归转非递归的方法。
98.验证二叉搜索树?
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
1 | /* |
还有一种做法:中序遍历结果是递增的,即为二叉搜索树
1 | public boolean isValidBST(TreeNode root) { |
144.前序非递归遍历
1 | public List<Integer> preorderTraversal(TreeNode root) { |
94.中序非递归遍历
1.将整棵树的左子树压入栈中
2.每次取出栈顶元素,如果他有右子树,则将右子树压入栈中。
1 | /** |
144.后序非递归
1 | /** |
101.对称二叉树?
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1 | 1 |
递归做法
1 | /** |
非递归方法
1 | /** |
105.从前序和中序遍历序列构造二叉树
递归的方法
1 | public TreeNode buildTree(int[] preorder, int[] midorder) { |
106. 从中序与后序遍历序列构造二叉树
1 | public TreeNode buildTree(int[] inorder, int[] postorder) { |
889. 根据前序和后序遍历构造二叉树
1 | public TreeNode constructFromPrePost(int[] pre, int[] post) { |
102.二叉树层次遍历?
通过队列来解决
1 | public List<List<Integer>> levelOrder(TreeNode root) { |
236.二叉树的最近公共祖先?
1 | /** |
543.二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
示例 :
给定二叉树
1 | 1 |
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
1 | /** |
124.二叉树中最大路径和
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/
9 20
/
15 7
输出: 42
1 | int res=Integer.MIN_VALUE; |
173.二叉搜索树迭代器
可以用中序遍历来解决,但是要求空间复杂度为O(h),h为树的深度。
1 | class BSTIterator { |
285.后继节点问题

1 | /** |
297. 二叉树的序列化与反序列化
1 | public String serialize(TreeNode root) { |
层次遍历
1 | public String serialize(TreeNode root) { |
110. 平衡二叉树
1 | public boolean isBalanced(TreeNode root) { |
958. 完全二叉树
1 | /** |
222. 完全二叉树的节点个数?
1 | /** |
- 不判断root==null
- ||以及&&的问题