题目:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
分析思路以及代码:
分为三种情况:
1)二叉树为空,直接返回0
2)左子树或者右子树为空,直接返回左子树或者右子树的深度
3)左子树和右子树都不为空,分别求出左子树和右子树的深度,取最大值
二叉树的结构:
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
递归:
public int TreeDepth(TreeNode root) {
if(root==null)
return 0;
int num1 = TreeDepth(root.left);
int num2 = TreeDepth(root.right);
return 1+ (num1 > num2 ? num1 : num2);
}
非递归:
使用level表示当前树的深度,使用linkedList存放node节点,每次存放一层的节点,遍历完之后level++,如果当前节点还有左右子树,则将左右子树存放到链表中,继续遍历下一层。
public int TreeDepth1(TreeNode root) {
int level = 0;
LinkedList<TreeNode> q = new LinkedList<TreeNode>();
if(root == null)
return 0;
q.offer(root);//放入根节点
int len = 0;
int cur;//记录本层已经遍历的节点个数
while(q.isEmpty() == false){
len = q.size();
cur = 0;
while(cur < len){
TreeNode current = q.poll();//出队一个元素
cur++;
if(current.left != null){
q.offer(current.left);
}
if(current.right != null){
q.offer(current.right);
}
}//while
level++;//遍历完本层level++
}//while
return level;
}