LeetCode222. 完全二叉树的节点个数
给出一个完全二叉树,求出该树的节点个数。
示例 1:
- 输入:root = [1,2,3,4,5,6]
- 输出:6
示例 2:
- 输入:root = []
- 输出:0
示例 3:
- 输入:root = [1]
- 输出:1
提示:
- 树中节点的数目范围是[0, 5 * 10^4]
- 0 <= Node.val <= 5 * 10^4
- 题目数据保证输入的树是 完全二叉树
思路:
首先是完全二叉树的定义
思路:题目明确表明是一颗完全二叉树。我们可以根据公式求满二叉树的节点个数。
接下来,只要判断完全二叉树的左右子树是否是满二叉树,然后每一层返回深度就可以了。
对于不是满二叉树的情况再进行单独的处理。
class Solution { // 通用递归解法 public int countNodes(TreeNode root) { if(root == null) { return 0; } return countNodes(root.left) + countNodes(root.right) + 1; } } class Solution { // 迭代法 public int countNodes(TreeNode root) { if (root == null) return 0; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); int result = 0; while (!queue.isEmpty()) { int size = queue.size(); while (size -- > 0) { TreeNode cur = queue.poll(); result++; if (cur.left != null) queue.offer(cur.left); if (cur.right != null) queue.offer(cur.right); } } return result; } } class Solution { /** * 针对完全二叉树的解法 * * 满二叉树的结点数为:2^depth - 1 */ public int countNodes(TreeNode root) { if(root == null) { return 0; } int leftDepth = getDepth(root.left); int rightDepth = getDepth(root.right); if (leftDepth == rightDepth) {// 左子树是满二叉树 // 2^leftDepth其实是 (2^leftDepth - 1) + 1 ,左子树 + 根结点 return (1 << leftDepth) + countNodes(root.right); } else {// 右子树是满二叉树 return (1 << rightDepth) + countNodes(root.left); } } private int getDepth(TreeNode root) { int depth = 0; while (root != null) { root = root.left; depth++; } return depth; } }
标签:return,int,代码,随想录,Day22,queue,二叉树,countNodes,root From: https://www.cnblogs.com/dwj-ngu/p/16879352.html