代码随想录算法训练营第十四天-104二叉树的最大深度、111二叉树的最小深度、222完全二叉树的节点个数
初步题解
104 二叉树的最大深度
题目链接:(https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/)
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public int maxDepth(TreeNode root) { if (root == null) { return 0; } int leftLength = maxDepth(root.left); int rightLength = maxDepth(root.right); return 1 + Math.max(leftLength, rightLength); }
|
111 二叉树的最小深度
题目链接:(https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
public int minDepth(TreeNode root) { if (root == null) { return 0; } if (root.right == null) { return 1 + minDepth(root.left); } if (root.left == null) { return 1 + minDepth(root.right); } return 1 + Math.min(minDepth(root.right), minDepth(root.left)); }
|
222 完全二叉树的节点个数
题目链接:(https://leetcode.cn/problems/count-complete-tree-nodes/description/)
没有 AC,思路只有一半。根据题解:递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后按满二叉树的情况来算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
public int countNodes(TreeNode root) { int depth = getDepth(root); int num = (depth - 1) ^ 2 - 1; }
private int getDepth(TreeNode root) { int depth = 0; while (root != null) { depth++; root = root.left; } return depth; }
|
看解析
104 二叉树的最大深度
题目链接/文章讲解/视频讲解:(https://programmercarl.com/0104.二叉树的最大深度.html)
本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。
559. N 叉树的最大深度
题目链接 (https://leetcode.cn/problems/maximum-depth-of-n-ary-tree/)
1 2 3 4 5 6 7 8 9 10 11
| public int maxDepth(Node root) { if (root == null) { return 0; } int max = 0; for (Node child : root.children) { max = Math.max(maxDepth(child), max); } return 1 + max; }
|
111 二叉树的最小深度
题目链接/文章讲解/视频讲解:(https://programmercarl.com/0111.二叉树的最小深度.html)
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 注意是叶子节点。(左右孩子都为空的节点才是叶子节点)
222 完全二叉树的节点个数
题目链接/文章讲解/视频讲解:(https://programmercarl.com/0222.完全二叉树的节点个数.html)
递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后按满二叉树的情况来算。所以需要判断是否是满二叉树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
public int countNodes(TreeNode root) { if (root == null) { return 0; } TreeNode left = root.left; TreeNode right = root.right; int leftLength = 0, rightLength = 0; while (left != null) { left = left.left; leftLength++; } while (right != null) { right = right.right; rightLength++; } if (leftLength == rightLength) { return (2 << leftLength) - 1; } return countNodes(root.left) + countNodes(root.right) + 1; }
|