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

作者: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. BZOJ 4556 [HEOI2016/TJOI2016]字符串

    BZOJ 4556 [HEOI2016/TJOI2016]字符串 其实题解更多是用后缀数组+数据结构的做法,貌似也不好写. 反正才学了 sam 貌似比较简单的做法. 还是得先二分,然后倍增跳到 $ s ...

  2. phpexcel 另存Excel文件方式

    $w = new PHPExcel_Writer_Excel5($e); $dir = 'path/title.xls'; $w->save($dir);

  3. 15.Pow(x, n)

    Pow(x, n) Total Accepted: 88351 Total Submissions: 317095 Difficulty: Medium Implement pow(x, n). 思路 ...

  4. 作为Java技术面试官,我如何深挖候选人的技能

    作为Java资深技术面试官,首先我感觉有必要讲解"面试官深挖问题"的动机,在了解动机的前提下,大家才能更好地准备面试.面试官为什么要在一个点上深挖?两大目的.   1 首先是通过深 ...

  5. Ubuntu apt代理apt-cacher-ng配置及使用

    apt-cacher-ng是更强大的apt代理服务器的替代方案,例如squid-deb-proxy.如果您正在运行小型家庭或办公室网络,那就别无所求.它可能缺少一些更高级的功能,但是可以立即进行配置, ...

  6. 数据集成工具—Sqoop

    数据集成/采集/同步工具 @ 目录 数据集成/采集/同步工具 Sqoop简介 Sqoop安装 1.上传并解压 2.修改文件夹名字 3.修改配置文件 4.修改环境变量 5.添加MySQL连接驱动 6.测 ...

  7. LeetCode两数之和

    LeetCode 两数之和 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是 ...

  8. 日常Java 2021/10/4

    读取控制台输入 将System.in包装在BufferedReader对象中来创建一个字符流 BufferedReader b = new BufferedReader(new InputStream ...

  9. acquaint

    Interpersonal relationships are dynamic systems that change continuously during their existence. Lik ...

  10. win10产品密钥 win10永久激活密钥(可激活win10所有版本)

    https://www.win7w.com/win10jihuo/18178.html#download 很多人都在找2019最新win10永久激活码,其实win10激活码不管版本新旧都是通用的,也就 ...