LeetCode OJ 222. Count Complete Tree Nodes
2016-05-09 09:28
441 查看
Total Accepted: 32628 Total Submissions: 129569 Difficulty: Medium
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.
如果用暴力递归来计算节点总数,那么会超时,时间复杂度是O(N)。由于我们求的是完全二叉树的节点数,如果用求普通二叉树的方法来解决肯定是不合适的。完全二叉树的一些特点可能成为我们解决该问题的思路:如果一个节点的左子树的深度和右子树的深度一样,那么以该节点为根节点的树的节点数为:h2-1。最好情况下的时间复杂度为O(h),其它情况的时间复杂度为O(h2)。代码如下:
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.
如果用暴力递归来计算节点总数,那么会超时,时间复杂度是O(N)。由于我们求的是完全二叉树的节点数,如果用求普通二叉树的方法来解决肯定是不合适的。完全二叉树的一些特点可能成为我们解决该问题的思路:如果一个节点的左子树的深度和右子树的深度一样,那么以该节点为根节点的树的节点数为:h2-1。最好情况下的时间复杂度为O(h),其它情况的时间复杂度为O(h2)。代码如下:
/** * 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 l = getLeft(root) + 1; int r = getRight(root) + 1; if(l==r) { return (2<<(l-1)) - 1; } else { return countNodes(root.left) + countNodes(root.right) + 1; } } private int getLeft(TreeNode root) { int count = 0; while(root.left!=null) { root = root.left; ++count; } return count; } private int getRight(TreeNode root) { int count = 0; while(root.right!=null) { root = root.right; ++count; } return count; } }
相关文章推荐
- hadoop2集群中的datanode启动以后自动关闭的问题
- LeetCode 117. Populating Next Right Pointers in Each Node II
- LeetCode 116. Populating Next Right Pointers in Each Node
- Ambari node heartbeat lost
- Node中的全局对象和全局变量
- ( Leetcode 25 ) Reverse Nodes in k-Group
- Node.js第一讲
- 一个使用了nodejs+express的简单jsonp接口模拟脚本
- nodepad++快捷键收集
- 在Node.js中实现任务调度与执行
- ionic+nodejs开发遇到的跨域和post请求数据问题
- JavaScript_查找指定节点之后的下一个元素节点_getNextElement(node)_JavaScript扩展
- node.js 创建子进程 II
- Permission denied: user=root, access=WRITE, inode="/":hadoopuser:supergroup:drwxr-xr-x
- (转)DOM中的动态NodeList与静态NodeList
- Hadoop2.6的DataNode启动不了
- leetcode 19. Remove Nth Node From End of List-移除链表元素|双指针
- LeetCode 024 Swap Nodes in Pairs
- nodejs01--什么是nodejs,nodejs的基本使用
- 用一个小例子,来分析nodejs的异步调用的顺序