101. Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3]
is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following [1,2,2,null,3,null,3]
is not:
1 / \ 2 2 \ \ 3 3
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean isSymmetric(TreeNode root) { if(root==null) return true; return ismirror(root.left,root.right); } public boolean ismirror(TreeNode left,TreeNode right) { if(left==null&&right==null) return true; if(left==null||right==null) return false; if(left.val!=right.val) return false; return ismirror(left.left,right.right)&&ismirror(left.right,right.left); } }
104. Maximum Depth of Binary Tree
Example:
Given binary tree [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
return its depth = 3.
public int maxDepth(TreeNode root) { if(root==null) return 0; int left = maxDepth(root.left); int right = maxDepth(root.right); return left>right?left+1:right+1; }
用栈深度优先
用两个栈 stack用来深度遍历树 values存储遍历时到每个节点时的高度 max存储最大值
public int maxDepth(TreeNode root) { if(root==null) return 0; Stack<TreeNode> stack = new Stack<>(); Stack<Integer> values = new Stack<>(); stack.push(root); values.push(1); int max=1; while(!stack.isEmpty()) { TreeNode temp = stack.pop(); int val = values.pop(); max = Math.max(max,val); if(temp.left!=null) { stack.push(temp.left); values.push(val+1); } if(temp.right!=null) { stack.push(temp.right); values.push(val+1); } } return max; }
用队列广度优先遍历
public int maxDepth(TreeNode root) { if(root==null) return 0; int count=0; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); int size=0; TreeNode temp; while(!queue.isEmpty()) { size=queue.size();//每一层有多少个元素 while(size-->0) { temp=queue.poll(); if(temp.left!=null) queue.offer(temp.left); if(temp.right!=null) queue.offer(temp.right); } count++;//遍历完一层高度+1 } return count; }
107. Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
return its bottom-up level order traversal as:
[ [15,7], [9,20], [3] ]
class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> res = new LinkedList<>(); if(root==null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while(!queue.isEmpty()) { int size = queue.size(); List<Integer> list = new LinkedList<>(); while(size-->0) { TreeNode p = queue.poll(); if(p.left!=null) queue.offer(p.left); if(p.right!=null) queue.offer(p.right); list.add(p.val); } res.add(0, list); } return res; } }方法二
public List<List<Integer>> levelOrderBottom(TreeNode root) { LinkedList<List<Integer>> res = new LinkedList<>(); if(root==null) return res; leveladd(res,root,0); return res; } private void leveladd( LinkedList<List<Integer>> res, TreeNode root, int level) { if(root==null) return; if(res.size()-1<level) res.addFirst(new LinkedList<Integer>());//如果对应层级的list不存在则新建一个 res.get(res.size()-1-level).add(root.val);//在res中取对应层级的list存储值 leveladd(res,root.left,level+1); leveladd(res,root.right,level+1); }
108. Convert Sorted Array to Binary Search Tree
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example:
Given the sorted array: [-10,-3,0,5,9], One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST: 0 / \ -3 9 / / -10 5
将排序数组转变为排序二叉树
数组为排序二叉树中序遍历的结果
public TreeNode sortedArrayToBST(int[] nums) { return convert(nums,0,nums.length-1); } private TreeNode convert(int[] nums, int left,int right) { if(left>right) return null; TreeNode head = null; int mid=(left+right)/2; head = new TreeNode(nums[mid]); head.left=convert(nums,left,mid-1); head.right=convert(nums,mid+1,right); return head; }