Idiot-maker

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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;
    }
}

这种递归的题目,在二叉树中极为常见,也是常见的思路。

posted on 2015-06-13 16:44  NickyYe  阅读(340)  评论(0编辑  收藏  举报