[Leetcode] Binary search -- 222. 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 2h nodes inclusive at the last level h.

Solution:

1. 1st naive method.
traverse every node, use bfs or dfs
or use recursive count; They are suitable for any types of tree.

2.  2nd method use recursively get left and right tree‘s height

if left and right-subtree height h_sub is the same, then it is full binary tree, so we can get the number of nodes = 2^h_sub -1
else recursively get left subtree node number and right subtree‘s node number
http://www.programcreek.com/2014/06/leetcode-count-complete-tree-nodes-java/

 1  def getLeftMostHeight(root):
 2             depthLeft = 0
 3             while(root):
 4                 root = root.left
 5                 depthLeft += 1
 6             return depthLeft
 7
 8
 9         def getRightMostHeight(root):
10             depthRight = 0
11             while(root):
12                 root = root.right
13                 depthRight += 1
14             return depthRight
15
16         depthLeft = getLeftMostHeight(root)
17         depthRight = getRightMostHeight(root)
18         if depthLeft == depthRight:
19             return 2**(depthLeft) - 1
20         else:
21             return 1 + self.countNodes(root.left) + self.countNodes(root.right) 

3. 3rd use binary search

I refer to this guy‘s blog. It is brilliant idea to do binary search
the tree height is h
the node number is the last layer number n_last + the full binary tree‘s number (2^(h-1)-1)
(1) the full binary tree could be determined by the traversing rightmost node from the root of whole tree
(2) how to determine the last layer number n_last is the key problem. we observe in the last layer there are continuous node from left to right represented by 111...11000..00, in which all "1" means nodes exist, "0" means nodes doesn‘t exist. all "1" are in the left of "0". Therefore, we need to find the position of the last "1" in the array using binary search.
the binary tree could be similar to binary array. The difference is how to decide the middle. ( we use the leftmost node of the right subtree from root to get the middle position and then determine to search the left subtree from root or the right subtree from the root.

reference:  http://yucoding.blogspot.ca/2015/10/leetcode-question-question-count.html

 1    def findMiddleDepth(root):
 2             if root:
 3                 root = root.right
 4                 depth = 0
 5                 while (root):
 6                     root = root.left
 7                     depth += 1
 8                 return depth
 9             return 0
10
11         if not root:
12             return 0
13         #get height of tree h, the full binary tree height is (h-1)
14         dep = 1
15         tmp = root
16         while (tmp.left):
17             dep += 1
18             tmp = tmp.left
19
20         curr_root = root
21         curr_dep = 1
22         ans = 0
23         while (curr_dep < dep):
24             midPosHeight = findMiddleDepth(curr_root)
25             if midPosHeight + curr_dep == dep:
26                 curr_root = curr_root.right
27                 ans += 2**(midPosHeight-1)
28             else:
29                 curr_root = curr_root.left
30                 curr_dep += 1
31         return 2**(dep-1) + ans
32         
时间: 2024-10-06 10:44:36

[Leetcode] Binary search -- 222. Count Complete Tree Nodes的相关文章

8.8 LeetCode 222 Count Complete Tree Nodes

Question: Count Complete Tree Nodes Total Accepted: 11040 Total Submissions: 53992My Submissions Question Solution Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from Wikipedia:In a complete binary tree

【LeetCode】222. Count Complete Tree Nodes

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 le

[LeetCode] 222. Count Complete Tree Nodes Java

题目: 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

LeetCode OJ 222. 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 pos

Java for LeetCode 222 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 po

(medium)LeetCode 222.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 pos

LeetCode 222. Count Complete Tree Nodes

complete binary tree:除最后一行外每一行的节点都有两个儿子,最后一行的节点尽可能靠左. ver0: 1 class Solution { 2 public: 3 int countNodes(TreeNode* root) { 4 if(!root) return 0; 5 return 1 + countNodes(root->left) + countNodes(root->right); 6 } 7 }; 不出意料地TLE. ver1: 1 class Solutio

leetcode 222 Count Complete Tree Nodes (计算完全二叉树节点数)

1. 问题描述 计算完全二叉树的节点数.对于完全二叉树的定义可参考wikipedia上面的内容. 2. 方法与思路 最简单也最容易想到的方法就是使用递归,分别递归计算左右子树的节点数的和.但此方法最容易超时,一般不可取. int countNodes(TreeNode* root) { if(root == NULL) return 0; else if(root->left == NULL) return 1; return countNodes(root->left) + countNod

[leetcode]222. Count Complete Tree Nodes完全二叉树的节点数

/* 满二叉树的特点是2^n-1,对于完全二叉树,一个node如果左右子树深度相同,那么 是一个满二叉树.如果不是,那就把node算上,继续往下看,下边的可能是满二叉树 由于完全二叉树中有一些子满二叉树,所以可以省时间 */ public int countNodes(TreeNode root) { if (root==null) return 0; int l = getLeft(root); int r = getRight(root); return (l == r)?(1<<l)-1