数据结构二叉树遍历例题的程序,用c语言怎么实现?

是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因
为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

 注意:树形结构中,子树之间不能有交集,否则就不是树形结构

节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
森林:由m(m>0)棵互不相交的树的集合称为森林;

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既要保存值域,也要保存结点和结点之间
的关系
,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法
等。我们这里就简单的了解其中最常用的孩子兄弟表示法

 树在实际中的运用(表示文件系统的目录树结构)

一棵二叉树是结点的一个有限集合,该集合:
2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成

 从上图可以看出:
1. 二叉树不存在度大于2的结点

2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

注意:对于任意的二叉树都是由以下几种情况复合而成的:

 现实中的二叉树:

 特殊的二叉树:

1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K
的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对
应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 个结点.
2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 .
3. 对任何一棵二叉树, 如果度为0其叶结点个数为 , 度为2的分支结点个数为 ,则有N0 =N2 +1
5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对
1. 若i>0,i位置节点的双亲序号(i-1)/2;i=0,i为根节点编号,无双亲节点

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空
间的浪费
。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺
序存储在物理上是一个数组,在逻辑上是一颗二叉树。

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是
链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所
在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程
学到高阶数据结构如红黑树等会用到三叉链.

二叉树的顺序结构及实现

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结
构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统
虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

关于堆的一些介绍我们在前文中提到过

 二叉树链式结构的实现

2. 非空:根节点,根节点的左子树、根节点的右子树组成的

 从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。

前序、中序以及后序遍历
学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉
树中的节点进行相应的操作,并且每个节点只操作一次
。访问结点所做的操作依赖于具体的应用问题。 遍历
是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。


按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:
1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。

根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历

 前序遍历递归图解:

层序遍历:除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在
层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层
上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历

 节点个数以及高度等

二叉树叶子节点个数 

// 二叉树叶子节点个数
 





// 二叉树第k层节点个数
 
二叉树查找值为x的节点

// 二叉树查找值为x的节点
 

// 判断二叉树是否是完全二叉树
 


判断二叉树是否是完全二叉树
//判断二叉树是否是完全二叉树
 // 遇到空了以后,检查队列中剩下的节点
// 1、剩下全是空给,则是完全二叉树
// 2、剩下存在非空,则不是完全二叉树

感谢各位大佬的文章,实在学到许多。


什么是内存对齐,原理你真的了解吗?
(史上最详细的解释看过来)深入理解函数栈帧
float类型在内存中的表示
静态链接与动态链接的区别
进程间的五种通信方式介绍
为什么会引入线程(进程,优缺点,模型)!!!
进程与线程的概念,为什么要有进程线程?有什么区别?各自又是怎么同步的?
C++中的类——类的定义和声明
const关键字作用总结
lib和dll文件的初了解
重载、重写和隐藏三者的区别
C语言为什么不支持函数重载
如何重载前置++和后置++
C++:为什么在继承关系中,父类的析构函数最好定义为虚函数?
简单的程序诠释C++ STL算法系列之十五:swap
使用sizeof计算类对象所占空间大小-sizeof总结
函数返回值和返回引用的 区别
[c++11]我理解的右值引用、移动语义和完美转发
构造函数能不能声明为虚函数,析构函数呢?为什么?
C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现
09 构造函数能调用虚函数吗?
析构函数声明为私有的作用
C# 是使用引用计数来发现垃圾对象的吗?
unity面试——Lua 实现简单的面向对象
Unity,C#各种管理类(一)--音频管理
Unity某个向量围绕某个轴旋转多少度
光线与包围盒(AABB)的相交检测算法
码农干货系列1--方向包围盒(OBB)碰撞检测
空间划分的数据结构(四叉树/八叉树/BVH树/BSP树/k-d树)
游戏场景管理的八叉树算法是怎样的?
从0开始的OpenGL学习(二十五)-几何着色器
前向渲染和延迟渲染的区别
OpenGL中的模板测试有哪些实际应用?
OpenGL中的Alpha测试,深度测试,模板测试,裁减测试
图形学可能会问到的数学知识
快速排序和堆排序的使用场景比较
  • 首先快排最适合用来排序完全随机的数据,此时不存在退化情况(只要不是人品极差,或者可以随机选择主元规避退化情况)。其次,虽然三者的渐进运行时间都是O(nlgn),但隐藏在O里的系数快排是最小的。再次,快排和堆排是原址(in place)的,这一点归并在运行时还要负担额外的内存开销。故快排总体表现是最稳定的,也是工业上使用最为广泛的排序之一。
堆排序中建堆过程的时间复杂度O(n)的证明
在海量数据中找到最大的前K个数(top K问题)
N个降序数组,找到最大的K个数TOP K
基于双向链表的增删改查和排序(C++实现)
各种字符串Hash函数(转)
数据结构 Hash表(哈希表)
面试题——轻松搞定面试中的红黑树问题
30张图带你彻底理解红黑树
红黑树 插入调整步骤终极详解
数据结构和算法 O(1)时间取得栈中的最大 / 最小元素值
上千万数据的IP取前100个出现次数最多的
(二叉树)二叉树的最近公共祖先
判断一个图是否有环 无向图 有向图
总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较
Dijkstra不能得到含有负权边图的单源最短路径
二叉树顺序存储之 前序,中序 ,后序遍历
二叉树的中序遍历非递归算法
3阶以内的矩阵求逆矩阵的3种手算方法
牛人解释哈希的开放寻址法
Hash树(散列树)和Trie树(字典树、前缀树)
动态规划入门之硬币问题
游戏设计模式——有限状态机
游戏设计模式——黑板模式
游戏设计模式——内存池管理
游戏设计模式——面向数据编程
面试必备:常用的设计模式总结
TCP的三次握手与四次挥手理解及面试题(很全面)
详解TCP中的拥塞控制
解析TCP之滑动窗口(动画演示)
可靠UDP,KCP协议快在哪?
不为人知的网络编程(七):如何让不可靠的UDP变的可靠?
HTTP长连接、短连接究竟是什么?
TCP如何保证消息顺序以及可靠性到达
数据库索引的实现原理(面试问题:请说出数据库索引实现原理)
AB抛硬币,先抛到正面的人赢,问A赢的概率
最后一面《HR面》------十大经典提问

我要回帖

更多关于 二叉树遍历例题 的文章

 

随机推荐