几种常见的二叉树:
满二叉树 :除了叶子节点外,所有节点都有两个儿子,深度为 k 的满二叉树具有 2^k - 1 个节点。
完全二叉树 :若设二叉树的高度为h,除第h层外,其他各层 (1 ~ h -1)层节点都达到最大个数,第h层的叶子节点从左到右依次排列。
平衡二叉树(AVL) :是一棵平衡的二叉查找树。任何一个节点的左右两个儿子的高度差不超过1,并且其左右子树都是平衡二叉树。
二叉查找树(BST) : 左 < 根 < 右。(BST不一定是平衡二叉树)
遇到二叉树问题,就想想整棵树在该问题上的结果和左右子树在该问题上的结果之间的联系。
二叉树问题常常伴随着遍历出现,基本的就有前序遍历,中序遍历,后续遍历。三种遍历的实现分为递归实现和非递归实现,而递归实现又可以分为遍历法和分治法。区分遍历法可以简单想为遍历就是都是自己去做,而分治是分给自己的小弟去做。
一般分子二叉树问题都可以使用分治,就是无脑的先丢给左子树,然后无脑的丢给右子树,得到左右子树的结果之后再考虑根节点。
这里就先给出三种遍历的三种实现方法。前序遍历:根左右 中序遍历:左根右 后续遍历:左右根
前序遍历遍历法:
1 public ArrayList<Integer> preorderTraversal(TreeNode root) { 2 // write your code here 3 ArrayList<Integer> result = new ArrayList<Integer>(); 4 preorderHelp(result,root); 5 return result; 6 } 7 public void preorderHelp(ArrayList<Integer> result , TreeNode root) { 8 if (root == null) { 9 return; 10 } 11 result.add(root.val); 12 preorderHelp(result, root.left); 13 preorderHelp(result, root.right); 14 }