樹是一種比較重要的數據結構,尤其是二叉樹。二叉樹是一種特殊的樹,在二叉樹中每個節點最多有兩個子節點,一般稱為左子節點和右子節點(或左孩子和右孩子),並且二叉樹的子樹有左右之分,其次序不能任意顛倒。二叉樹是遞歸定義的,因此,與二叉樹有關的題目基本都可以用遞歸思想解決,當然有些題目非遞歸解法也應該掌握,如非遞歸遍歷節點等等。本文努力對二叉樹相關題目做一個較全的整理總結,希望對找工作的同學有所幫助。
二叉樹節點定義如下:

public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x){ val = x; left = null; right = null; } }
題目列表:
1. 求二叉樹中的節點個數
2. 求二叉樹的深度
3. 前序遍歷,中序遍歷,后序遍歷
4.分層遍歷二叉樹(按層次從上往下,從左往右)
5. 將二叉查找樹變為有序的雙向鏈表
6. 求二叉樹第K層的節點個數
7. 求二叉樹中葉子節點的個數
8. 判斷兩棵二叉樹是否結構相同
9. 判斷二叉樹是不是平衡二叉樹
10. 求二叉樹的鏡像
11. 求二叉樹中兩個節點的最低公共祖先節點
12. 求二叉樹中節點的最大距離
13. 由前序遍歷序列和中序遍歷序列重建二叉樹
14.判斷二叉樹是不是完全二叉樹
按知識點分類
1.1 深度優先遍歷。可解答二叉樹中的節點個數、前序遍歷,中序遍歷,后序遍歷等問題。
1.1.1 遞歸

public void preOrder(ArrayList<Integer> res, TreeNode node){ if(node == null){ return; } res.add(node.val); preOrder(res, node.left); preOrder(res, node.right); } public void inOrder(ArrayList<Integer> res, TreeNode node){ if(node == null){ return; } inOrder(res, node.left); res.add(node.val); inOrder(res, node.right); } public void postOrder(ArrayList<Integer> res, TreeNode node){ if(node == null){ return; } postOrder(res, node.left); postOrder(res, node.right); res.add(node.val); }
1.1.2 非遞歸

public ArrayList<Integer> preOrderStack(TreeNode node){ if(node == null){ return null; } ArrayList<Integer> res = new ArrayList<Integer>(); Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode p = node; while(p != null || !stack.isEmpty()){ while(p != null){ res.add(p.val); stack.push(p); p = p.left; } if(!stack.isEmpty()) { p = stack.pop(); p = p.right; } } return res; } public ArrayList<Integer> inOrderStack(TreeNode node){ if(node == null){ return null; } ArrayList<Integer> res = new ArrayList<Integer>(); Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode p = node; while(p != null || !stack.isEmpty()){ while(p != null){ stack.push(p); p = p.left; } if(!stack.isEmpty()){ p = stack.pop(); res.add(p.val); p = p.right; } } return res; } public ArrayList<Integer> postOrderStack(TreeNode node){ if(node == null){ return null; } TreeNode p; TreeNode pre = null; Stack<TreeNode> stack = new Stack<TreeNode>(); ArrayList<Integer> res = new ArrayList<Integer>(); stack.push(node); while(!stack.isEmpty()){ p = stack.peek(); if((p.left == null && p.right == null) || (pre != null && (pre == p.right || pre == p.left))){ res.add(p.val); pre = p; stack.pop(); }else{ if(p.right != null){ stack.push(p.right); } if(p.left != null){ stack.push(p.left); } } } return res; }
1.2 廣度優先遍歷。可解答分層遍歷二叉樹(按層次從上往下,從左往右)等問題。
1.2.1 遞歸
1.2.2 非遞歸