平衡二叉树(c++实现)续
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!!
作者:mohist
--- 欢迎指正---
题外话:上一篇关于平衡二叉树文章中,我都没说自己是怎么理解的。别人终归就是别人的。但别人真的是写的棒棒的。
这里续平衡二叉树的其他方法:
二叉树的 层次遍历 。
层次遍历,原则:从上到下,从左到右。
1、使用队列:
思路:
A、首先将根结点入队
B、再输出队首的值
C、若队首结点的左孩子不为空,将其入队
D、若队首结点的右孩子不为空,将其入队
E、因为已经输出队首的值,这时,需要将其出队。
F、反复执行A到E的步骤。直到树的最后一个元素。
分析:
执行过上面的步骤 E,此时,队列中对头的元素就是上次以入队的元素,若步骤C中队首的左孩子不为空,左孩子就是现在的队首。当执行下一次循环是,首先输出的就是左孩子了。同理,步骤D中的右孩子如果入队,下次循环执行输出的就是它了。以此类推。
2、上源码:
例子中使用的根结点结构:
struct node
{
int data;
int height;
node *lc;
node *rc;
node()
: data(0)
, height(0)
, lc(0)
, rc(0)
{ }
};
使用队列,需要包含头文件
#include <queue>
队列实现:
// 层次遍历树 (使用队列)
void layer_order()
{ cout << endl << endl << "层次遍历,是用队列完成" << endl;
queue<node*> vq; if (NULL != root)
vq.push(root); // 队列不为空,继续遍历
while (false == vq.empty())
{
cout << vq.front()->data << " -> "; // 若左孩子不为空,则继续加入队列
if ( NULL != vq.front()->lc )
{
vq.push(vq.front()->lc);
} // 若右孩子不为空,则继续入队
if (NULL != vq.front()->rc)
vq.push(vq.front()->rc); // 已经遍历输出的元素,出队
vq.pop();
} cout << endl << endl;
}
我的测试结果:
4、其他方法
若不实用队列,怎么实现?
数组。前提,数组能够存放整棵树的结点、数组大小不会 爆栈 。有缺陷。
数组的化,模拟上面的队列输出,增加两个索引,一个用来添加树的结点元素用,一个用来输出元素用。
上代码:
// 层次遍历,不是用队列,使用数组完成
void layer_order_arr()
{
cout << endl << endl << " 层次遍历,不是用队列,使用数组完成 " << endl; // 定义指针数组的大小
const int arr_len = 100;
// 保存结点指针
node *arr[arr_len] = {0}; // 添加元素索引,添加到数组时使用
int in_index = 0; // 输出元素索引,输出元素使用
int out_index = 0; // 添加结点
if (NULL != root)
arr[in_index++] = root; // 若 添加元素索引大于输出元素索引,说明数组中还有没有输出的元素
while ( in_index > out_index)
{
// 输出
cout << arr[out_index]->data << " -> "; // 若左子树不为空,将其添加到数组
if (NULL != arr[out_index]->lc)
arr[in_index++] = arr[out_index]->lc; // 若右子树不为空,将其添加到数组
if (NULL != arr[out_index]->rc)
arr[in_index++] = arr[out_index]->rc; // 输出索引指向数组的下一个元素
out_index++;
}
}
数组的方式输出结果:
GitHub地址: https://github.com/mohistH/base_data_structure
平衡二叉树(c++实现)续的更多相关文章
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入
上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- iOS 开发者账号到期续费流程
1.登录developer.apple.com,查看到期时间 2.到期提醒通知,点击Renew Membership续费(一般提前一个月提醒续费) 3.个人开发者账号续费需要支付 688人民币/年(9 ...
- [LeetCode] Balanced Binary Tree 平衡二叉树
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- Java数据结构——平衡二叉树的平衡因子(转自牛客网)
若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性.首先要找出插入新结点后失去平衡的最小子树根结点的指针.然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树.当失去平衡的最小子树被 ...
- 微信公众号开发系列教程一(调试环境部署续:vs远程调试)
http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...
- 【数据结构】平衡二叉树—AVL树
(百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ...
- CI-持续集成(1)-软件工业“流水线”概述
CI-持续集成(1)-软件工业“流水线”概述 1 概述 持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次, ...
随机推荐
- CF605E Intergalaxy Trips
CF605E Intergalaxy Trips 考虑你是不知道后来的边的出现情况的,所以可以这样做:每天你都选择一些点进行观察,知道某天往这些点里面的某条边可用了,你就往这条边走.这样贪心总是对的. ...
- Topcoder 14719 - RatingProgressAward(最小割)
题面传送门 神仙最小割--好久没写过网络流了,故写题解以祭之( 首先考虑一个非常 trivial 的问题:如果知道排列顺序之后怎样计算最大值,用脚趾头想一下就能知道是原序列的最大子段和,因为每个课程之 ...
- Comet OJ Contest #13 D
Comet OJ Contest #13 D \(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n- ...
- Linux图片查看软件ImageMagick安装
在Linux中查看图片,这个需求是非常常见的.总不至于在集群中生成个图片,随便看下效果,也要用filezilla.winscp之类的远程文件传输工具导过来导过去吧,这样效率太低. Linux图片查看常 ...
- Macbook pro进入恢复模式以及无法进入恢复模式解决方案
看网上很多说用Command+R进入恢复模式,但是,大部分都反馈说,此命令并不能进入恢复模式.我自己也尝试发现了同样问题,最终发现解决方案: 问题出在,[是重新启动电脑,而不是关机+按开机键,否则会造 ...
- react native安装遇到的问题
最近学习react native 是在为全栈工程师而努力,看网上把react native说的各种好,忍不住学习了一把.总体感觉还可以,特别是可以开发android和ios这点非常厉害,刚开始入门需要 ...
- 什么是DDL,DML,DCL
转载自 https://www.2cto.com/database/201610/555167.html DML.DDL.DCL区别 . 总体解释: DML(data manipulation la ...
- ansible-playbook 编译安装nginx
mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,default,meta} -pv └── nginx ├── ...
- 「译」 .NET 6 中 gRPC 的新功能
gRPC是一个现代的.跨平台的.高性能的 RPC 框架.gRPC for .NET 构建在 ASP.NET Core 之上,是我们推荐的在 .NET 中构建 RPC 服务的方法. .NET 6 进一步 ...
- Largest Rectangle in Histogram及二维解法
昨天看岛娘直播解题,看到很经典的一题Largest Rectangle in Histogram 题目地址:https://leetcode.com/problems/largest-rectangl ...