Count Complete Tree Nodes
2015-10-04 12:39
651 查看
原题链接
题意
题意
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. wiki链接: https://en.wikipedia.org/wiki/Binary_tree#Types_of_binary_trees[/code]
思路根据完全二叉树的性质, 左右子树的高度要么相等, 要么相差1. 当相等的时候, 其节点数为 (1 << height) - 1.
code/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: // int getHeight(const TreeNode* root, const bool flag /*left: false, right: true*/) { // if(root == NULL) return 0; // if(flag) { // return 1 + getHeight(root->right, flag); // } else { // 1 + getHeight(root->left, flag); // } // } int getHeight(const TreeNode* root, const bool flag /*left: false, right: true*/) { int h = 0; if(root == NULL) return h; while(root) { h++; if(flag) root = root->right; else root = root->left; } return h; } int countNodes(TreeNode* root) { /// method 1 --> O(n), where N is the number of nodes in the tree /// Causing `Time Limit Exceeded` // if(root == NULL) return 0; // return 1 + countNodes(root->left) + countNodes(root->right); /// method 2 --> O(N), where N is the number of nodes in the tree /// Causing `Time Limit Exceeded` // if(root == NULL) return 0; // list<TreeNode*> q; // q.push_back(root); // int cnt = 0; // while(!q.empty()) { // TreeNode* f = q.front(); // q.pop_front(); // if(!f) break; // cnt++; // if(f->left) q.push_back(f->left); // if(f->right) q.push_back(f->right); // } // return cnt; /// method 3 /// 如果从某节点root起, 其左子树(包括root)的高度 == 其右子树(包括root)的高度 /// 那么以root为根的树一定是complete binary tree(complete binary tree的节点数为2^h - 1). /// 如果高度不相等, 则递归调用 return countNode(left) + countNode(right) + 1. /// 复杂度为O(h^2), h为树的高度/深度. if(root == NULL) return 0; // getHeight: using recursive may cause `Time Limit Exceeded` int lh = getHeight(root, false); int rh = getHeight(root, true); if(lh == rh) return (1 << lh) - 1; return 1 + countNodes(root->left) + countNodes(root->right); } };
相关文章推荐
- 命令行快速技巧:如何定位一个文件
- jquery+CSS实现的多级竖向展开树形TRee菜单效果
- cmd tree命令 以树形格式罗列文件
- 推荐8款jQuery轻量级树形Tree插件
- tree 以树形格式罗列文件
- EasyUI Tree+Asp.net实现权限树或目录树导航的简单实例
- E3 tree 1.6在Firefox下显示问题的修复方法
- js树形控件脚本代码
- swing中Tree与滚动条用法实例分析
- Spark Decision Tree
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- 带check的treeView
- extjs 4 treepanel locked and expand
- JQuery EasyUI 实现tree的右键菜单
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III