public List<List<Integer>> levelOrderBottom(TreeNode root) {
		List<List<Integer>> result = new LinkedList<List<Integer>>();
		if (root == null) {
			return result;
		}
		Stack<LinkedList<TreeNode>> levels = new Stack<LinkedList<TreeNode>>();
		LinkedList<TreeNode> currentLevel = new LinkedList<TreeNode>();
		currentLevel.add(root);
		levels.add(currentLevel);
		while (!currentLevel.isEmpty()) {
			LinkedList<TreeNode> nextLevel = new LinkedList<TreeNode>();
			for (TreeNode node : currentLevel) {
				if (node.left != null) {
					nextLevel.add(node.left);
				}
				if (node.right != null) {
					nextLevel.add(node.right);
				}
			}
			if (!nextLevel.isEmpty()) {
				levels.add(nextLevel);
			}
			currentLevel = nextLevel;
		}
		while (!levels.isEmpty()) {
			List<Integer> levelVal = new LinkedList<Integer>();
			for (TreeNode node : levels.pop()) {
				levelVal.add(node.val);
			}
			result.add(levelVal);
		}
		return result;
	}