222.完全二叉树的节点个数
基本思想:
递归
具体实现:
普通二叉树求节点个数
1.递归参数以及返回值
参数:根节点
返回值:以该节点为根节点的二叉树的节点数量
2.递归终止条件
遍历到空节点的话,返回0,表明节点数为0
3.单层递归的逻辑
先求左子树节点数量,再求右子树节点数量,最后取总再加1(当前节点)
完全二叉树求节点个数
两种情况:
1.满二叉树,节点个数 = 2^树深度-1
2.分别递归左孩子和右孩子,低轨道某一深度会有左孩子或右孩子是满二叉树,按照情况1来算
代码:
普通二叉树求节点个数
class Solution { public int countNodes(TreeNode root) { if (root == null) { return 0; } return countNodes(root.left) + countNodes(root.right) +1; } }
完全二叉树求节点个数
class Solution { /** * 针对完全二叉树的解法 * * 满二叉树的结点数为:2^depth - 1 */ public int countNodes(TreeNode root) { TreeNode l = root, r = root; int hl = 0, hr = 0; while (l != null){ l = l.left; hl++; } while (r != null){ r = r.right; hr++; } if(hl == hr){ return (int)Math.pow(2,hl) -1; } return 1 + countNodes(root.left) + countNodes(root.right); } }
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; } }