题1:
JZ55 二叉树的深度
描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。 数据范围:节点的数量满足 0 \le n \le 1000≤n≤100 ,节点上的值满足 0 \le val \le 1000≤val≤100进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)
假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:
1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 public int TreeDepth(TreeNode root) { 16 if (root==null) return 0; 17 return Math.max(TreeDepth(root.left),TreeDepth(root.right))+1; 18 } 19 }
思路:递归,左子树与右子树最大深度+1;
题2:
JZ77 按之字形顺序打印二叉树
描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 100∣val∣<=100要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n) 例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树之字形层序遍历的结果是 [ [1], [3,2], [4,5] ]
1 import java.util.*; 2 /* 3 public class TreeNode { 4 int val = 0; 5 TreeNode left = null; 6 TreeNode right = null; 7 8 public TreeNode(int val) { 9 this.val = val; 10 11 } 12 13 } 14 */ 15 public class Solution { 16 public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { 17 Queue<TreeNode> queue=new LinkedList<>(); 18 ArrayList<ArrayList<Integer>> ans=new ArrayList<>(); 19 if (pRoot==null) return ans; 20 queue.offer(pRoot); 21 boolean flag=true; 22 while (!queue.isEmpty()){ 23 int size=queue.size(); 24 ArrayList<Integer> list=new ArrayList<>(); 25 for (int i=0;i<size;i++){ 26 TreeNode temp=queue.poll(); 27 list.add(temp.val); 28 if (temp.left!=null) queue.offer(temp.left); 29 if (temp.right!=null) queue.offer(temp.right); 30 } 31 if (!flag) { 32 Collections.reverse(list); 33 } 34 flag=!flag; 35 ans.add(list); 36 } 37 return ans; 38 } 39 40 }
思路:每一层的节点放入队列中,遍历时根据flag标记看要不要反转。