文章目录
- 题目
- 方法一:把该题当做一个普通的二叉树来做(任何遍历都可以)
- 方法二:利用完全二叉树的性质来做
题目
方法一:把该题当做一个普通的二叉树来做(任何遍历都可以)
例如:二叉树的前序遍历(维护一个全局变量)递归无返回值
class Solution {int num = 0;public int countNodes(TreeNode root) {dfs(root);return num;}public void dfs(TreeNode root){if(root == null) return;num++;dfs(root.left);dfs(root.right);}
}
方法二:利用完全二叉树的性质来做
- 当前节点只要满足完全二叉树的话,可以通过2^depth-1来计算以当前节点为父节点的数的节点数,这样减少很多递归操作,不需要递归找到每一个节点
- 当前节点不满足二叉树的性质 ,那就走常规递归到下一层,再来判断
一定要画图 模拟递归过程
lass Solution {public int countNodes(TreeNode root) {return dfs(root);}public int dfs(TreeNode root){if(root == null) return 0;int leftsum = 1;//root不为null 自然高度起始就是1int rightsum = 1;TreeNode left = root.left;TreeNode right = root.right;//寻找以该节点为父节点的左右子树的高度while(left!=null){left = left.left;leftsum++;}while(right!=null){right = right.right;rightsum++;}//如果左右子树的高度相等 说明以该节点为父节点的数是完全二叉树 ,所以可以按照完全二叉树的性质来计算节点数 2的高度次方-1 if(rightsum == leftsum) return (int)Math.pow(2, rightsum) - 1;//如果左右子树的高度不相等 那么进入下一层常规递归int left_ = dfs(root.left);int right_ = dfs(root.right);return left_+right_+1;//最后返回左右子树节点数之和在加上本节点}
}