平衡二叉树(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)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次, ...
随机推荐
- Codeforces 690A2 - Collective Mindsets (medium)
Codeforces 题面传送门 & 洛谷题面传送门 一道脑筋急转弯的结论题. 首先我们考虑对于某个特定的金币数 \(m\),有哪些 \(n\) 满足条件.考虑最 naive 的情况,\(m= ...
- Codeforces 521D - Shop(贪心)
Codeforces 题目传送门 & 洛谷题目传送门 一道不算太难的贪心,可惜又没自己想出来,显然省选之后我的能力呈 \(y=-1145141919810192608179998244353x ...
- vim——批量缩进
批量缩进 第一种 按esc,退出编辑模式,到命令模式,并在英语输入法下输入":" 将所要批量缩进的行号写上,按照格式:"行号1,行号2>"输入命令,如要将 ...
- 解决CentOS7 docker容器映射端口只监听ipv6的问题
问题现象 docker容器起来以后,查看9100端口监听情况,如下图: $ ss -lntp State Recv-Q Send-Q Local Address:Port Peer Address:P ...
- c#页面查询、数据显示
page : <%@ Control Language="C#" AutoEventWireup="true" CodeFile="Queryx ...
- 全网最详细的ReentrantReadWriteLock源码剖析(万字长文)
碎碎念) 花了两天时间,终于把ReentrantReadWriteLock(读写锁)解析做完了.之前钻研过AQS(AbstractQueuedSynchronizer)的源码,弄懂读写锁也没有想象中那 ...
- 入坑不亏!我们最终决定将 70w+ 核心代码全部开源
作者 | 一啸 来源 | 尔达 Erda 公众号 背景故事 2017 年初,我们基于 DC/OS (mesos + marathon) 开始构建端点自己的 PaaS 平台,核心任务就是解决公司的软件开 ...
- Stream collect Collectors 常用详细实例
返回List集合: toList() 用于将元素累积到List集合中.它将创建一个新List集合(不会更改当前集合). List<Integer> integers = Arrays.as ...
- ubuntu基础
下载地址: http://cdimage.ubuntu.com/releases/ #:配置多网卡静态IP地址和路由 root@ubuntu:~# vim /etc/netplan/01-netcfg ...
- Spring Batch Event Listeners
Learn to create and configure Spring batch's JobExecutionListener (before and after job), StepExecut ...