class Solution { public List<Integer> preorderTraversal(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); List<Integer> list = new LinkedList<>(); if(root == null){ return list; } //第一步是将根节点压入栈中 stack.push(root); //当栈不为空时,出栈的元素插入list尾部。 while(!stack.isEmpty()){ root = stack.pop(); list.add(root.val); if(root.right != null) stack.push(root.right); if(root.left != null) stack.push(root.left); } return list; } }
中序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); TreeNode cur = root; while (cur != null || !stack.isEmpty()) { if (cur != null) { stack.push(cur); cur = cur.left; } else { cur = stack.pop(); list.add(cur.val); cur = cur.right; } } return list; } }
后序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); if(root == null) return res; Stack<TreeNode> stack = new Stack<TreeNode>(); stack.push(root); while(!stack.isEmpty()){ TreeNode node = stack.pop(); if(node.left != null) stack.push(node.left);//和传统先序遍历不一样,先将左结点入栈 if(node.right != null) stack.push(node.right);//后将右结点入栈 res.add(0,node.val); //逆序添加结点值 } return res; } }
public List<List<Integer>> levelOrder(TreeNode root) { if(root == null) return new ArrayList<>(); List<List<Integer>> res = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(root); while(!queue.isEmpty()){ int count = queue.size(); List<Integer> list = new ArrayList<Integer>(); while(count > 0){ TreeNode node = queue.poll(); list.add(node.val); if(node.left != null) queue.add(node.left); if(node.right != null) queue.add(node.right); count--; } res.add(list); } return res; }
平衡二叉树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
class Solution { private boolean isBalanced = true; public boolean isBalanced(TreeNode root) { getDepth(root); return isBalanced; } public int getDepth(TreeNode root) { if (root == null) return 0; int left = getDepth(root.left); int right = getDepth(root.right); if (Math.abs(left - right) > 1) { isBalanced = false; } return right > left ? right + 1 : left + 1; } }