leetcode:count the number of nodes
2016-04-03 16:02
501 查看
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.
Subscribe to see which companies asked this question
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.
Subscribe to see which companies asked this question
/** * 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 { private: int countNodesHelper(TreeNode* root, int curLevel, int treeHight) { if (curLevel == treeHight) return 1; int righTreeMostLevel = (root->right != NULL)? leftMostLevel(root->right, curLevel+1) : curLevel; if (righTreeMostLevel == treeHight)//如果右子树的最左子树能到达全树的高度 { //则,左子树就是一颗满的二叉树,并且左子树的高度为treeHight-curLevel, 节点数目为 2e(treeHight-curLevel)-1; 再加上root节点, 数目为 2e(treeHight-curLevel) return (1 << (treeHight-curLevel)) + countNodesHelper(root->right, curLevel+1, treeHight); } else // 如果右子树的最左子树不能达到全树的高度, { //则,右子树一定是一个满的二叉树,并且右子树的高度为 treeHight-curLevel-1, 节点数目为2e(treeHight-curLevel-1)-1, //再加上root节点,数目为2e(treeHight-curLevel-1) return (1 << (treeHight-curLevel-1) + countNodesHelper(root->left, curLevel+1, treeHight)); } } int leftMostLevel(TreeNode* root, int level) { TreeNode* curNode = root; int curLevel = level; while (curNode->left) { curLevel++; curNode = curNode->left; } return curLevel; } int TreeHight(TreeNode *root) { if (root == NULL) return 0; int leftHight = TreeHight(root->left); int rightHight = TreeHight(root->right); return max(leftHight, rightHight)+1; } int fTreeHt(TreeNode *root){ //get the height of a complete binary tree. if(!root) return 0; return 1+fTreeHt(root->left); } public: int countNodes(TreeNode* root) { if(!root) return 0; //要获取左右子树的高度 int lh=fTreeHt(root->left); int rh=fTreeHt(root->right); if(lh==rh) return (1<<lh)+countNodes(root->right); /*1(根节点) + (1<<lh)-1(完全左子树) + # of rightNode */ else return (1<<rh)+countNodes(root->left); /*1(根节点) + (1<<rh)-1(完全右子树) + # of leftNode*/ } /* int countNodes(TreeNode* root) { if (root == NULL) return 0; int h = TreeHight(root); return countNodesHelper(root, 1, h); } */ };
相关文章推荐
- Node.js中的etag包知识学习之express的配置etag
- 117. Populating Next Right Pointers in Each Node II
- 116. Populating Next Right Pointers in Each Node
- nodejs npm常用命令
- Node.js 应用跑得更快 10 个技巧
- (OK) CORE nodes access Internet—虚拟节点访问互联网—commands
- Node.js 应用跑得更快 10 个技巧
- win7下安装node.js,包括npm 之后将coffeescript格式文件编译成js文件
- 【nodejs】创建udp套接字的类型参数的含义
- ext2/3/4的inode结构说明
- leetcode 19.Remove Nth Node From End of List
- [转] Node.js 服务端实践之 GraphQL 初探
- leetcode---Remove Nth Node From End of List
- Jade、EJS、JSHTML、Mustache、Handlebars 五大node模板引擎区别
- HDFS DataNode 设计实现解析
- HDFS NameNode 设计实现解析
- Node.js进程管理之Process模块
- 初识Node.js
- nodejs pm2的简单应用
- 利用socket.io实现多人聊天室(基于Nodejs)