二叉树刷题篇 完全二叉树的节点个数

Posted 归宅观察部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树刷题篇 完全二叉树的节点个数相关的知识,希望对你有一定的参考价值。

222. 完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

https://leetcode-cn.com/problems/count-complete-tree-nodes/


首先来了解一下完全二叉树的定义:
完全二叉树 的定义如下:
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

完全二叉树

首先,思路1:遍历二叉树,在遍历的同时记录节点个数。

那么,遍历二叉树的套路我们已经熟悉了,要么递归,要么迭代,递归使用后序遍历(左->右->中),迭代使用栈或者队列进行层序遍历。

直接上代码:
递归法:
class Solution {private: int getNodesNum(TreeNode* cur) { if (cur == 0) return 0; int leftNum = getNodesNum(cur->left); // 左 int rightNum = getNodesNum(cur->right); // 右 int treeNum = leftNum + rightNum + 1; // 中 return treeNum; }public: int countNodes(TreeNode* root) { return getNodesNum(root); }};//代码来自公众号 代码随想录 作者为Carl
迭代法:
class Solution {public: int countNodes(TreeNode* root) { queue<TreeNode*> que; if (root != NULL) que.push(root); int result = 0; while (!que.empty()) { int size = que.size(); for (int i = 0; i < size; i++) { TreeNode* node = que.front(); que.pop(); result++; // 记录节点数量 if (node->left) que.push(node->left); if (node->right) que.push(node->right); } } return result; }};//代码来自公众号 代码随想录 作者为Carl
这样就解决了这道题。但这样的时间复杂度为O(n),力扣官方在这道题的最后,问了这样一个问题,如何在时间复杂度小于 O(n) 的情况下解决这道题?

这其实就需要利用到“完全二叉树”这个条件。读者不妨思考一下,如何去通过这个条件实现自己的算法。

用人类的思想去思考,其实就是,假如最后一层的个数为x,二叉树的深度为n+1(为了方便认为是n+1),那么二叉树的节点数就是x+2^n-1。

也就是说, 我们真正需要的信息只有最后一层有几个节点,还有二叉树的最大深度是多少!
即,思路2:求左右子树的深度,如果他们相等,那么这个二叉树是满二叉树,可以用公式算出它的节点数。
如果它不是一个满二叉树,也可以递归到它的某一个子树是满二叉树的情况,那么依然可以用公式计算。

那么该如何使用程序来实现呢?我们直接上代码吧(今天有点忙鸽了咕咕咕)
class Solution {public: int countNodes(TreeNode* root) { if (root == nullptr) return 0; TreeNode* left = root->left; TreeNode* right = root->right; int leftHeight = 0, rightHeight = 0; // 这里初始为0是有目的的,为了下面求指数方便 while (left) { // 求左子树深度 left = left->left; leftHeight++; } while (right) { // 求右子树深度 right = right->right; rightHeight++; } if (leftHeight == rightHeight) { return (2 << leftHeight) - 1; // 注意(2<<1) 相当于2^2,所以leftHeight初始为0 } return countNodes(root->left) + countNodes(root->right) + 1; }};
作者:carlsun-2链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/222-pu-tong-er-cha-shu-yu-wan-quan-er-cha-shu-qi-2/
当然,这里还有一种二分查找的算法,也是试图找到最后一层最后一个节点的位置,就不列在这里了!看看明天是否有时间补上哈哈~

以上是关于二叉树刷题篇 完全二叉树的节点个数的主要内容,如果未能解决你的问题,请参考以下文章

二叉树刷题篇(完) 二叉搜索树的修剪构造与转换

二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数

二叉树刷题专练

二叉树刷题篇(10) 二叉搜索树

二叉树刷题篇

二叉树刷题篇层序遍历