浅谈二叉树

二叉树

二叉树不是树的一种特殊情形,尽管其与树有许多相似之处,但树和二叉树有两个主要差别:

1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;

2. 树的结点无左、右之分,而二叉树的结点只有左、右之分。

下图即为一个典型是二叉树!!!

接下来就来分析这个图:

在这“棵”树上

根结点 ------ F

叶子结点 ------ A 、B 、H 、 M

子结点 ----- 除了 根结点F 的其他结点

父亲结点 ----- 除了 叶子结点 的其他结点

兄弟结点 ----- 【C 、E】【A 、D】【H 、G】

堂兄结点 ----- 【B 、M】【A 、H】【D  、G】

深度 ----- 这棵树的深度为4

......像这样的专业术语还有很多,这里就列举了几个常用的。

接着就来看一下二叉树的几种形态:

A ------ 一颗空二叉树。(记住:没有东西,也可以是一颗二叉树,只不过是一颗空树)

B ------ 有一个结点的二叉树。(这一个结点既是根结点,也是叶子结点)

C ------ 只有左子树。

D ------ 只有右子树。

E ------ 完全二叉树。(这里完全二叉树只一种特殊的二叉树)

所以这样可以定义二叉树:

struct Binary_tree //构建二叉树
{
	int Date ; //结点数值
	struct Binary_tree *lchild ; //左子树
	struct Binary_tree *rchild ; //右子树 (这里左右子树也可以看成二叉树)
} *Bitree ;

介绍一下特殊的二叉树:

1、完全二叉树:

定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边的若干结点缺失的二叉树,则此二叉树成为完全二叉树。

2、满二叉树:

定义:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。(这里是国内的说法,国外的说法不同)

3、平衡二叉树:

定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树:(1)它的左子树和右子树的高度之差绝对值不超过1;(2)它的左子树和右子树都是平衡二叉树。

以上三种为特殊的二叉树,都十分的特别,都具有一些性质。(这里就不详细的讲解了)

最后来讲一下二叉树的遍历:

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。

由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。

遍历规则:

⑴访问结点本身(N),

⑵遍历该结点的左子树(L),

⑶遍历该结点的右子树(R)。

遍历方法:

一、 NLR:前序遍历

(Preorder Traversal 亦称(先序遍历))

——访问根结点的操作发生在遍历其左右子树之前。

⑴ 访问根(N)结点;

⑵ 遍历左(L)子树;

⑶ 遍历右(R)子树。

void NLR_PreTraversal ( Binary_tree *tree ) //先序遍历
{
	if ( tree->Data == NULL )
	{
		return;
	}
	cout << tree->Data ;
	NLR_PreTraversal ( tree->lchild ) ;
	NLR_PreTraversal ( tree->rchild ) ;
}

二、 LNR:中序遍历

(Inorder Traversal)

——访问根结点的操作发生在遍历其左右子树之中(间)。

⑴遍历左(L)子树;

⑵访问根(N)结点;

⑶遍历右(R)子树。

void LRN_InoTraversal ( Binary_tree *tree ) //中序遍历
{
	if ( tree->Data == NULL )
	{
		return;
	}
	LRN_InoTraversal ( tree->lchild ) ;
	cout << tree->Data ;
	LRN_InoTraversal ( tree->rchild ) ;
}

三、 LRN:后序遍历

(Postorder Traversal)

——访问根结点的操作发生在遍历其左右子树之后。

⑴遍历左(L)子树;

⑵遍历右(R)子树;

⑶访问根(N)结点。

void LRN_PosTraversal ( Binary_tree *tree ) //后序遍历
{
	if ( tree->Data == NULL )
	{
		return;
	}
	LRN_PosTraversal ( tree->lchild ) ;
	LRN_PosTraversal ( tree->rchild ) ;
	cout << tree->Data ;
}

注:还有层序遍历,其实就只BFS(宽度优先搜索),这里就不单独提出来了。

以上即为我总结的二叉树基础内容。

原文地址:https://www.cnblogs.com/yhz-Albert/p/11234605.html

时间: 2024-11-09 00:59:57

浅谈二叉树的相关文章

浅谈二叉树遍历的栈方法

  众多周知,对于二叉树的遍历, 一种比较容易理解以及编写的方式就是递归的方式了,下面针对二叉树遍历的中序遍历做一个简单的分析: void travelTree(BiTree T, int deep){ if (T->lchild != NULL) travelTree(T->lchild, ++deep); for (int x = 0; x < deep; x++) { printf("--"); } printf("%c\n", T->

浅谈二叉树的遍历(先序遍历、中序遍历、后序遍历)

先序遍历:根-左儿子-右儿子(根左右) 中序遍历:左儿子-根-右儿子(左根右) 后序遍历:左儿子-右儿子-根(左右根) 通常来说这都记得住. 这时MY大神来一句:"我记不住" 记不住的话可以这么理解:先序遍历根在先,中序遍历根在中,后序遍历根在后,左儿子永大于右儿子 现在来看一张图 这张图的遍历: 中序遍历:4251637 4,2,5--左根右嘛这可以理解,可是后面为什么是1? 我们把425看做一个整体,再把637看做一个整体.425是1的左儿子(左子树),637就是1的右儿子.是哈.

浅谈数据结构-二叉树

浅谈数据结构-二叉树 二叉树是树的特殊一种,具有如下特点:1.每个结点最多有两颗子树,结点的度最大为2.2.左子树和右子树是有顺序的,次序不能颠倒.3.即使某结点只有一个子树,也要区分左右子树. 一.特殊的二叉树及特点 1.斜树 所有的结点都只有左子树(左斜树),或者只有右子树(右斜树).这就是斜树,应用较少 2.满二叉树 所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样就是满二叉树.就是完美圆满的意思,关键在于树的平衡. 根据满二叉树的定义,得到其特点为: 叶子只能出现

浅谈算法和数据结构

: 一 栈和队列 http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算

浅谈MySQL索引背后的数据结构及算法

摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是 平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 文章主要内容分为四个部分. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. 第二部分结合MySQL数据库中

浅谈java类集框架和数据结构(2)

继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主要有最重要的三种实现:ArrayList,Vector,LinkedList,三种List均来自AbstracList的实现,而AbstracList直接实现了List接口,并拓展自AbstractCollection. 在三种实现中,ArrayList和Vector使用了数组实现,可以认为这两个是

浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的时候具有较高的灵活性,而有序数组在查找时具有较高的效率,本文介绍的二叉查找树(Binary Search Tree,BST)这一数据结构综合了以上两种数据结构的优点. 二叉查找树具有很高的灵活性,对其优化可以生成平衡二叉树,红黑树等高效的查找和插入数据结构,后文会一一介绍. 一 定义 二叉查找树(B

浅谈数据结构-树

树是一种数据结构,其中一个元素可以有两个或者多个数据元素,具有一对多的特点,用树结构来存储文件. 树的概念 结点的度:子结点的个数.例如结点1中有3个子结点,结点1的度是3. 树的度:树的度等于所有结点度中度最高的值.结点最高的度为3,树的度为3. 叶子结点:度为0的结点,即没有子结点的结点.例如:上图中3,5,6,7,9,10. 分支结点:除了叶子结点以外的结点,即度不为0的结点.例如:上面树的分支结点为1,2,4,8. 内部结点:除了根结点以及叶子结点或在分支结点的基础之上在去掉根结点.例如

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化