输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。
数据范围:节点的数量满足
,节点上的值满足 
进阶:空间复杂度
,时间复杂度 )
假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:
// 递归层次遍历 import java.util.*; public class Solution { public int TreeDepth(TreeNode root) { if (root == null) return 0; Queue<TreeNode> queue1 = new LinkedList(); Queue<TreeNode> queue2 = new LinkedList(); queue1.add(root); // 广度遍历 int depth = deepth(queue1, queue2, 0); return depth; } private int deepth(Queue<TreeNode> queue1, Queue<TreeNode> queue2, int depth) { if (!queue1.isEmpty() && queue2.isEmpty()) { while (!queue1.isEmpty()) { TreeNode node = queue1.poll(); if (node.left != null) { queue2.add(node.left); } if (node.right != null) { queue2.add(node.right); } } return deepth(queue1, queue2, depth += 1); } else if (queue1.isEmpty() && !queue2.isEmpty()) { while (!queue2.isEmpty()) { TreeNode node = queue2.poll(); if (node.left != null) { queue1.add(node.left); } if (node.right != null) { queue1.add(node.right); } } return deepth(queue1, queue2, depth += 1); } else { return depth; } } }
public class Solution { private int res = 0; public int TreeDepth(TreeNode root) { dfs(root, 1); return res; } public void dfs(TreeNode root, int deep) { if (root == null) { return; } res = Math.max(res, deep); dfs(root.left, deep + 1); dfs(root.right, deep + 1); } }
public class Solution { public int TreeDepth(TreeNode root) { if(root == null) return 0; int left = TreeDepth(root.left); int right = TreeDepth(root.right); //left和right的意义是该结点左子树和右子树深度,结果取最大 return 1 + Math.max(left, right); } }
public class Solution { public int maxDepth = 0; public int TreeDepth(TreeNode root) { handle(root, 1); return maxDepth; } public void handle(TreeNode root, int count) { if(root == null) return ; if(count > maxDepth) maxDepth = count; handle(root.left, count + 1); handle(root.right, count + 1); } }
import java.util.*; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public int TreeDepth(TreeNode root) { if(root == null){ return 0; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); int depth = 0; while(!queue.isEmpty()){ int size = queue.size(); depth++; while(size != 0){ TreeNode cur = queue.poll(); if(cur.left != null){ queue.offer(cur.left); } if(cur.right != null){ queue.offer(cur.right); } size--; } } return depth; //方法2 // public int max = 0; // public void TreeNodeHelper(TreeNode root,int cur){ // if(root == null){ // //去重 // if(max < cur){ // max = cur; // } // return; // } // TreeNodeHelper(root.left,cur + 1); // TreeNodeHelper(root.right,cur + 1); // } // public int TreeDepth(TreeNode root) { // if(root == null){ // return 0; // } // int depth = 0; // TreeNodeHelper(root,depth); // return max; //方法1 // int leftTree = TreeDepth(root.left); // int rightTree = TreeDepth(root.right); // return (leftTree > rightTree) ? leftTree + 1 : rightTree + 1; } }
public class Solution { public int TreeDepth(TreeNode root) { if(root==null){ return 0; } int left = TreeDepth(root.left); int right = TreeDepth(root.right); return Math.max(left,right)+1; } }非递归:
import java.util.Deque; import java.util.LinkedList; public class Solution { public int TreeDepth(TreeNode root) { if(root==null){ return 0; } Deque<TreeNode> queue = new LinkedList(); queue.add(root); int depth = 0; while(!queue.isEmpty()){ depth++; int queueSize = queue.size(); for(int i=0;i<queueSize;i++){ TreeNode node = queue.pollFirst(); if(node.left!=null){ queue.add(node.left); } if(node.right!=null){ queue.add(node.right); } } } return depth; } }