彻底二叉树的节点个数


给出一个彻底二叉树,求出该树的节点个数java


解题思路

最直观的一种解法:遍历整颗彻底二叉树,记录每个节点code

class Solution {

    public int countNodes(TreeNode root) {
    	if (root == null){
        	return 0;
    	}
    	return countNodes(root.left) + countNodes(root.right) + 1;
	}
}

但这样的话,对于本题给出的彻底二叉树性质彻底没有利用起来。首先明确彻底二叉树的定义:它是一棵空树,或者它的叶子节点只出现最后两层,若最后一层不满则叶子节点只在最左侧递归

回顾一下满二叉树的节点个数,若是满二叉树的层数为 h,则总节点数为 2h - 1,咱们对 root 节点的左右子树进行高度统计,分别记为 left 和 right,有如下两种结果:io

  1. left == right
    这说明左子树必定是彻底二叉树,由于最后一层的节点已经填充到右子树了,因此左子树的节点个数就是 2left - 1,再加上当前的 root 节点,则是 2left 个节点,再对右子树递归统计
  2. left != right
    说明此时倒数第二层满了,但最后一层不满,并且左子树没有彻底填充,右子树是一颗满二叉树,所以同上,右子树的节点个数为 2right,再对左子树进行递归统计
class Solution {

    public int countNodes(TreeNode root) {
        if(root == null){
           return 0;
        } 
        int left = countLevel(root.left);
        int right = countLevel(root.right);
        if(left == right){
            return countNodes(root.right) + (1<<left);
        }else{
            return countNodes(root.left) + (1<<right);
        }
    }
    
    private int countLevel(TreeNode root){
        int level = 0;
        while(root != null){
            level++;
            root = root.left;
        }
        return level;
    }
}
相关文章
相关标签/搜索