!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!!

作者: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++实现)续的更多相关文章

  1. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入

    上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...

  2. [.NET] C# 知识回顾 - 委托 delegate (续)

    C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...

  3. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  4. iOS 开发者账号到期续费流程

    1.登录developer.apple.com,查看到期时间 2.到期提醒通知,点击Renew Membership续费(一般提前一个月提醒续费) 3.个人开发者账号续费需要支付 688人民币/年(9 ...

  5. [LeetCode] Balanced Binary Tree 平衡二叉树

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  6. Java数据结构——平衡二叉树的平衡因子(转自牛客网)

    若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性.首先要找出插入新结点后失去平衡的最小子树根结点的指针.然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树.当失去平衡的最小子树被 ...

  7. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  8. 【数据结构】平衡二叉树—AVL树

    (百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ...

  9. CI-持续集成(1)-软件工业“流水线”概述

    CI-持续集成(1)-软件工业“流水线”概述 1   概述 持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次, ...

随机推荐

  1. Codeforces 690A2 - Collective Mindsets (medium)

    Codeforces 题面传送门 & 洛谷题面传送门 一道脑筋急转弯的结论题. 首先我们考虑对于某个特定的金币数 \(m\),有哪些 \(n\) 满足条件.考虑最 naive 的情况,\(m= ...

  2. Codeforces 521D - Shop(贪心)

    Codeforces 题目传送门 & 洛谷题目传送门 一道不算太难的贪心,可惜又没自己想出来,显然省选之后我的能力呈 \(y=-1145141919810192608179998244353x ...

  3. vim——批量缩进

    批量缩进 第一种 按esc,退出编辑模式,到命令模式,并在英语输入法下输入":" 将所要批量缩进的行号写上,按照格式:"行号1,行号2>"输入命令,如要将 ...

  4. 解决CentOS7 docker容器映射端口只监听ipv6的问题

    问题现象 docker容器起来以后,查看9100端口监听情况,如下图: $ ss -lntp State Recv-Q Send-Q Local Address:Port Peer Address:P ...

  5. c#页面查询、数据显示

    page : <%@ Control Language="C#" AutoEventWireup="true" CodeFile="Queryx ...

  6. 全网最详细的ReentrantReadWriteLock源码剖析(万字长文)

    碎碎念) 花了两天时间,终于把ReentrantReadWriteLock(读写锁)解析做完了.之前钻研过AQS(AbstractQueuedSynchronizer)的源码,弄懂读写锁也没有想象中那 ...

  7. 入坑不亏!我们最终决定将 70w+ 核心代码全部开源

    作者 | 一啸 来源 | 尔达 Erda 公众号 背景故事 2017 年初,我们基于 DC/OS (mesos + marathon) 开始构建端点自己的 PaaS 平台,核心任务就是解决公司的软件开 ...

  8. Stream collect Collectors 常用详细实例

    返回List集合: toList() 用于将元素累积到List集合中.它将创建一个新List集合(不会更改当前集合). List<Integer> integers = Arrays.as ...

  9. ubuntu基础

    下载地址: http://cdimage.ubuntu.com/releases/ #:配置多网卡静态IP地址和路由 root@ubuntu:~# vim /etc/netplan/01-netcfg ...

  10. Spring Batch Event Listeners

    Learn to create and configure Spring batch's JobExecutionListener (before and after job), StepExecut ...