参考自:《剑指Offer——名企面试官精讲典型编程题》
题目:二叉树的深度
输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
主要思路:使用递归,分别计算当前节点的左右子树的深度,取两者最大值,再加1。或者借助队列,使用层序遍历,每遍历一层,深度加1.
关键点:递归,层序遍历
时间复杂度:O(n)
public class TreeDepth
{
public static void main(String[] args)
{
// 10
// / \
// 6 14
// /\ /\
// 4 8 12 16
TreeNode root = TreeNode.generateBinaryTree();
System.out.println(computeDepth(root)); //4
System.out.println(computeDepthByLayer(root)); //4
}
//递归计算树深度
private static int computeDepth(TreeNode root)
{
if (root == null) return 0;
int leftDepth = computeDepth(root.left);
int rightDepth = computeDepth(root.right);
int result = leftDepth + 1;
if (rightDepth > leftDepth)
{
result = rightDepth + 1;
}
return result;
}
//按层遍历计算树深度
private static int computeDepthByLayer(TreeNode root)
{
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int depth = 0;
while (queue.size() != 0)
{
depth++;
//当前层的节点数
int size = queue.size();
//遍历当前层
for (int i = 0; i < size; i++)
{
TreeNode top = queue.poll();
if (top.left != null)
{
queue.add(top.left);
}
if (top.right != null)
{
queue.add(top.right);
}
}
}
return depth;
}
}
class TreeNode
{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x)
{
val = x;
}
// 10
// / \
// 6 14
// /\ /\
// 4 8 12 16
/**
* 生成二叉搜索树
* @return
*/
public static TreeNode generateBinaryTree()
{
TreeNode root = new TreeNode(10);
TreeNode node6 = new TreeNode(6);
TreeNode node14 = new TreeNode(14);
TreeNode node4 = new TreeNode(4);
TreeNode node8 = new TreeNode(8);
TreeNode node12 = new TreeNode(12);
TreeNode node16 = new TreeNode(16);
connectNode(root, node6, node14);
connectNode(node6, node4, node8);
connectNode(node14, node12, node16);
return root;
}
public static void connectNode(TreeNode root, TreeNode left, TreeNode right)
{
root.left = left;
root.right = right;
}
}