给定一个二叉树,找出其最大深度,二叉树的深度为根节点到最远叶子节点的最长路径上的节点数,时间复杂度为O(n²)
TreeNode节点结构
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}
使用两个队列交替储存每一层二叉树节点,当上层为空时总层数加1
public static int maxDepth(TreeNode root) { if (root==null){ return 0; } int crr=1;//根节点不为空 默认为一层 if (root!=null){ crr = 1; } if (root.right==null&&root.left==null)return 1; Queue queueP = new LinkedList();//放置上层元素队列 Queue queueC = new LinkedList();//放置下层元素队列 queueP.add(root); while (!queueP.isEmpty()) {//遍历一层 把下一层元素放在下层队列 TreeNode poll = (TreeNode) queueP.poll(); //出队一个 if (poll.right != null) { queueC.add(poll.right); } if (poll.left != null) { queueC.add(poll.left); } if (queueP.isEmpty()){//当上层队列为空时 把下层队列赋值给上层 crr++;//记录二叉树层数 t(queueC,queueP); } } return crr; } static void t(Queue queueC,Queue queueP){ while (!queueC.isEmpty()) { TreeNode poll1 = (TreeNode) queueC.poll(); if (poll1.left!=null){ queueP.add(poll1); } if (poll1.right!=null){ queueP.add(poll1); } } }
上述思路时间复杂度过高无法通过测试用例,改为使用判断队列中元素个数来决定下层循环退出条件
public int maxDepth(TreeNode root) { if (root==null){ return 0; } //创建一个队列 Queue deque = new LinkedList<>(); deque.add(root); int crr = 0; while (!deque.isEmpty()) { //每一层的个数 int size = deque.size(); while (size-- > 0) { TreeNode cur = (TreeNode)deque.poll(); if (cur.left != null) deque.add(cur.left); if (cur.right != null) deque.add(cur.right); } crr++; } return crr; }
原题链接
https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/