https://leetcode.com/problems/count-complete-tree-nodes/
Given a complete binary tree, count the number of nodes.
Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2hnodes inclusive at the last level h.
解题思路:
使用任何一种遍历方式,都能数出节点的数量。但是,本题给定是一颗完全二叉树,意图并不在于最朴素的方法。
tag里有binary search,其实是考递归,二叉树的题目一般都是考递归。
思考递归的思路。
1. 如果root==null,节点数量为0。也是递归的结束条件。
2. 如果以root为根的树是一颗满二叉树(注意满二叉树和完全二叉树的区别),根据等比数列公式,深度h的满二叉树,节点数量为2^h - 1。
3. 如果不是满二叉树,递归处理左右子树。那么以root为根的树的节点数量就是1 + count(root.left) + count(root.right),即本身加上左右子树的节点数量。
问题,如何判断一棵树为满二叉树?
问题分析到这里就很简单了,两个指针分别向root.left和root.right递归,也就是树的最左侧和最右侧,直到null。如果高度都相等,就证明是一颗满二叉树。
代码如下
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public int countNodes(TreeNode root) { if(root == null) { return 0; } int left = leftHeight(root.left); int right = rightHeight(root.right); if(left == right) { return (1 << left + 1) - 1; } return countNodes(root.left) + countNodes(root.right) + 1; } public int leftHeight(TreeNode root) { if(root == null) { return 0; } int left = leftHeight(root.left); return left + 1; } public int rightHeight(TreeNode root) { if(root == null) { return 0; } int left = rightHeight(root.right); return left + 1; } }
这种递归的题目,在二叉树中极为常见,也是常见的思路。