博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一颗完全二叉树,求其结点个数
阅读量:5025 次
发布时间:2019-06-12

本文共 3228 字,大约阅读时间需要 10 分钟。

网上看了很多人的答案,都说最优解是o(n),想到了一种更快的算法,复杂度是O(lgn的平方),就是对左右子树进行二分,找最后一层的最右边那个结点即可:

 

#include 
#include
#include
using namespace std;struct Node { Node* left; Node* right; ~Node() { if (left) { delete left; left = NULL; } if (right) { delete right; right = NULL; } }};int GetDepth(Node* root) { int depth = 0; while (root) { depth++; root = root->left; } return depth;}void GetMostRightDepthAndIndex(Node* root, int* depth, int* index) { while (root) { if (root->right) { root = root->right; *index = (*index - 1) * 2; *index += 2; *depth += 1; } else if (root->left) { root = root->left; *index = (*index - 1) * 2; *index += 1; *depth += 1; } else { return; } }}void GetMostLeftDepthAndIndex(Node* root, int* depth, int* index) { while (root) { if (root->left) { root = root->left; *index = (*index - 1) * 2; *index += 1; *depth += 1; } else if (root->left) { root = root->right; *index = (*index - 1) * 2; *index += 2; *depth += 1; } else { return; } }}void GetNodeNum(Node* root, int cur_depth, int cur_index, int* node_num, int max_depth) { if (!root->left) { if (cur_depth - 1 >= 1) { *node_num += pow(2, cur_depth - 1) - 1; } *node_num += cur_index; return; } int ml_depth = root->left ? cur_depth + 1 : cur_depth; int ml_index = (cur_index - 1) * 2 + 1; int mr_depth = root->right ? cur_depth + 1 : cur_depth; int mr_index = (cur_index - 1) * 2 + 2; GetMostRightDepthAndIndex(root->left, &ml_depth, &ml_index); GetMostLeftDepthAndIndex(root->right, &mr_depth, &mr_index); if (ml_depth == mr_depth) { if (ml_depth == max_depth) { GetNodeNum(root->right, cur_depth + 1, (cur_index - 1) * 2 + 2, node_num, max_depth); } else if (ml_depth < max_depth) { GetNodeNum(root->left, cur_depth + 1, (cur_index - 1) * 2 + 1, node_num, max_depth); } else { std::cout << "illegal tree"; exit(1); } } else if (ml_depth > mr_depth) { if (ml_depth == max_depth && mr_depth == max_depth - 1) { *node_num = pow(2, ml_depth - 1) - 1 + ml_index; } } else { std::cout << "illegal tree"; exit(1); }}int main() { /* Input: create a */ // depth 1 Node* root = new Node(); // depth 2 root->left = new Node(); root->right = new Node(); // depth 3 root->left->left = new Node(); root->left->right = new Node(); root->right->left = new Node(); root->right->right = new Node(); // depth 4 root->left->left->left = new Node(); root->left->left->right= new Node(); root->left->right->left = new Node(); root->left->right->right = new Node(); root->right->left->left = new Node(); root->right->left->right = new Node(); root->right->right->left = new Node(); root->right->right->right = new Node(); // depth 5 root->left->left->left->left = new Node(); int root_depth = 1; int root_index = 1; int max_depth = GetDepth(root); int node_num = 0; GetNodeNum(root, root_depth, root_index, &node_num, max_depth); std::cout << "node_num = " << node_num << endl; delete root;}

 

 

转载于:https://www.cnblogs.com/jiangu66/p/3236908.html

你可能感兴趣的文章
net core体系-web应用程序-4asp.net core2.0 项目实战(任务管理系统)-2项目搭建
查看>>
高效的jQuery
查看>>
ubuntu 16.04 (软件应用)-输入法
查看>>
windos7修复引导扇区
查看>>
Leetcode总结之Backtracking
查看>>
Android开发学习之路-图片颜色获取器开发(1)
查看>>
StackExchange.Redis 官方文档(一) Basics
查看>>
nupkg 之破解 nodejs+electron-packager 打包exe的解包
查看>>
Objective-C 使用 C++类
查看>>
浅谈之高级查询over(partition by)
查看>>
Notes: CRM Analytics–BI from a CRM perspective (2)
查看>>
graphite custom functions
查看>>
列出所有的属性键
查看>>
js获取请求地址后面带的参数
查看>>
[原创]使用java批量修改文件编码(ANSI-->UTF-8)
查看>>
设计模式のCompositePattern(组合模式)----结构模式
查看>>
二进制集合枚举子集
查看>>
磁盘管理
查看>>
SAS学习经验总结分享:篇二—input语句
查看>>
UIImage与UIColor互转
查看>>