输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。 
   数据范围:节点的数量满足  ,节点上的值满足
 ,节点上的值满足 
 
   进阶:空间复杂度 ) ,时间复杂度
 ,时间复杂度 )
 
   假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图: 
 import java.util.Queue;
import java.util.LinkedList;
public class Solution {
	public int TreeDepth(TreeNode pRoot)
    {
    	if(pRoot == null){
            return 0;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(pRoot);
        int depth = 0, count = 0, nextCount = 1;
        while(queue.size()!=0){
            TreeNode top = queue.poll();
            count++;
            if(top.left != null){
                queue.add(top.left);
            }
            if(top.right != null){
                queue.add(top.right);
            }
            if(count == nextCount){
                nextCount = queue.size();
                count = 0;
                depth++;
            }
        }
        return depth;
    }
}
import java.lang.Math;
public class Solution {
	public int TreeDepth(TreeNode pRoot)
    {
    	if(pRoot == null){
            return 0;
        }
        int left = TreeDepth(pRoot.left);
        int right = TreeDepth(pRoot.right);
        return Math.max(left, right) + 1;
    }
}
求树的深度,可以从层次遍历出发考虑 层次遍历可以使用队列完成,也可以使用递归完成,所以有两种方法 方法一:使用队列 class Solution: # 层次遍历 def levelOrder(self, root): # write your code here # 存储最后层次遍历的结果 res = [] # 层数 count = 0 # 如果根节点为空,则返回空列表 if root is None: return count # 模拟一个队列储存节点 q = [] # 首先将根节点入队 q.append(root) # 列表为空时,循环终止 while len(q) != 0: # 使用列表存储同层节点 tmp = [] # 记录同层节点的个数 length = len(q) for i in range(length): # 将同层节点依次出队 r = q.pop(0) if r.left is not None: # 非空左孩子入队 q.append(r.left) if r.right is not None: # 非空右孩子入队 q.append(r.right) tmp.append(r.val) if tmp: count += 1 # 统计层数 res.append(tmp) return count def TreeDepth(self, pRoot): # write code here # 使用层次遍历 # 当树为空直接返回0 if pRoot is None: return 0 count = self.levelOrder(pRoot) return count 方法二:使用递归方法 class Solution: def TreeDepth(self, pRoot): # write code here # 使用层次遍历 # 当树为空直接返回0 if pRoot is None: return 0 # 方法2:使用递归 # 如果该树只有一个结点,它的深度为1.如果根节点只有左子树没有右子树, # 那么树的深度为左子树的深度加1;同样,如果只有右子树没有左子树, # 那么树的深度为右子树的深度加1。如果既有左子树也有右子树, # 那该树的深度就是左子树和右子树的最大值加1. count = max(self.TreeDepth(pRoot.left), self.TreeDepth(pRoot.right)) + 1 return count
public class Solution {
	public int TreeDepth(TreeNode pRoot)
    {
    	return pRoot == null? 0 : Math.max(TreeDepth(pRoot.left),TreeDepth(pRoot.right)) + 1;
    }
}
Python 非递归解法
class Solution:
# 层次遍历
def levelOrder(self, root):
# 统计层数
count = 0
# 如果根节点为空,则返回空列表
if root is None: return count
# 模拟一个队列储存节点
q = []
# 首先将根节点入队
q.append(root)
# 列表为空时,循环终止,说明没有新的叶子节点层
while len(q) != 0:
# 记录同层节点的个数
length = len(q)
for i in range(length):
# 将同层节点依次出队
r = q.pop(0)
if r.left is not None:
# 非空左孩子入队
q.append(r.left)
if r.right is not None:
# 非空右孩子入队
q.append(r.right)
count += 1
return count
def TreeDepth(self, pRoot):
# 使用层次遍历,当树为空直接返回0
if pRoot is None: return 0
return self.levelOrder(pRoot)
/*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;
        if(root.left==null && root.right==null) return 1;
        int left=0,right=0;
        if(root.left!=null) left = TreeDepth(root.left);
        if(root.right!=null) right = TreeDepth(root.right);
        return left>right?left+1:right+1;
    }
}
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
看到二叉树,递归基本没跑了,我们只要想好递归关系即可。我们假设已经正确拿到了root结点左右子树的最大深度,那么最后加一即可。
public class Solution {
    public int TreeDepth(TreeNode root) {
        //递归的出口,root为0则返回0,这里可以理解为root为0那肯定没有层数了
        if(root == null){
            return 0;
        }
        //拿到左子树的最大深度
        int leftDep = TreeDepth(root.left);
        //拿到右子树的最大深度
        int rightDep = TreeDepth(root.right);
        //找出最大值,并且加上root这一层即可
        return Math.max(leftDep,rightDep) + 1;
    }
}import java.util.*;
public class Solution {
    public int TreeDepth(TreeNode root) {
        if(root==null) return 0;
        ArrayList<TreeNode> arr=new ArrayList<>();
        arr.add(root);
        int count=0;
        while(arr.size()!=0){
            count++;
            for(int i=0; i<arr.size(); i++){
                TreeNode temp=arr.remove(0);
                if(temp.left!=null) 
                    arr.add(temp.left);
                if(temp.right!=null) 
                    arr.add(temp.right);
            }
        }
        return count;
    }
}
 public class Solution {
    public int TreeDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        TreeNode cur = root;
        return bs(cur);
    }
    
    public int bs(TreeNode head) {
        if (head.left == null && head.right == null) {
            return 1;
        } else if (head.left != null && head.right == null) {
            return 1 + bs(head.left);
        } else if (head.left == null && head.right != null) {
            return 1 + bs(head.right);
        } else {
            return 1 + Math.max(bs(head.left), bs(head.right));
        }
    }
}
 //思路是层次遍历,通过插入特殊的结点new TreeNode(Integer.MIN_VALUE)来计算层次
public int TreeDepth(TreeNode root) {
        int depth=0;
        if(root!=null)
        {
        	Queue q=new LinkedList<TreeNode>();
        	q.offer(root);
        	q.offer(new TreeNode(Integer.MIN_VALUE));
        	while(!q.isEmpty())
        	{
        		TreeNode tmp=(TreeNode)q.poll();
        		if(tmp.val!=Integer.MIN_VALUE)
        		{
        			if(tmp.left!=null)
        				q.offer(tmp.left);
        			if(tmp.right!=null)
        				q.offer(tmp.right);
        		}
        		else//当遇到特殊节点时,说明当前层已经遍历完了同时下一层的所有节点已经全部入队了,在每层的最后压入一个特殊节点
        		{
        			depth++;
        			if(!q.isEmpty())//重点,不然会死循环
        				q.offer(new TreeNode(Integer.MIN_VALUE));
        		}
        	}
        }
        return depth;
    }