数据结构:树与二叉树

大部分笔记摘自《大话数据结构》与《数据结构》

一:相关定义

1、树是n个结点的有限集,n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m个互不相交的有限集,T1、T2、……、Tm,其中每一个集合本身又是一颗树,并且称为根的子树。

2、结点拥有的子树数称为结点的度,而树的度为结点的度的最大值。度为0的结点称为叶结点或终端结点,度不为0的结点称为分支结点、内部结点或非中断结点。

3、结点的子树的根称为结点的孩子,该结点称为孩子的双亲。同一双亲的为兄弟,祖先就是双亲一直往上一直到达根结点。树的层次数叫做树的深度或高度。

4、森林就是m课互不相交的树的集合,对于树中的每个结点而言,其子树的集合即为森林。

5、树的存储结构:双亲表示法、孩子表示法、孩子兄弟表示法。孩子兄弟表示法即设置两个指针分别指向该结点的第一个孩子和该结点的右兄弟,其最大的好处是将一颗复杂的树变成一颗二叉树。

6、一般来说,分等级的分类方案都可用层次结构来表示,即树结构。

二:叉树相关定义:

1、二叉树是n个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的、分别称为根结点的左子树或者右子树的二叉树组成。

2、每个结点最多只能有两棵子树,即度不大于2、左右子树有次序。

3、特殊的二叉树:斜树,只有左子树或者只有右子树;满二叉树,所有分支结点都满了;完全二叉树,由满二叉树往回砍的树。

三:

1、顺序存储结构对普通树这种一对多的关系结构实现起来比较复杂,但是二叉树是一种特殊的树,所以其用顺序结构也可以实现,不过顺序结构一般只用于完全二叉树,否则造成空间浪费。

2、二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域就比较自然,这样的链表称为二叉链表(只有一个指针域我们称为单链表)。如果再加一个指向双亲的指针域,就称为三叉链表。

3、二叉树的遍历方法主要有:前序遍历、中序遍历、后序遍历、层次遍历等。

前序遍历:先访问结点,然后前序遍历左子树,最后遍历右子树。

中序遍历:中间访问结点

后序遍历:最后访问结点

实例一:二叉树的建立与遍历

#include "stdio.h"
#include "malloc.h"

// 二叉树结点
typedef struct BTnode
{
	char data;
	struct BTnode *lchild,*rchild;
}BTnode;

/*
*	功能:先序创建一个二叉链表
*	输入:无
*	输出:二叉链表的根结点
*/
BTnode *create()
{
	BTnode *node;  // 结点指针
	char ch = ' ';
	scanf("%c",&ch);
	if(ch == '#')  // 用#号代替虚结点
		node = NULL;
	else
	{
		node = (BTnode *)malloc(sizeof(BTnode));  // 分配一个新结点
		node->data = ch;  // 存储数据
		node->lchild = create();  // 递归创建左子树结点
		node->rchild = create();  // 递归创建右子树结点
	}
	return node;  // 返回根节点
}

/*
*	功能:先序遍历二叉树
*	输入:二叉链表的根节点
*	输出:无
*/
void preOrderTraverse(BTnode *node)
{
	if(node==NULL)  // 如果结点为虚结点,则返回
		return ;
	printf("%c",node->data);  // 打印结点数据
	preOrderTraverse(node->lchild);  // 递归访问左子树结点
	preOrderTraverse(node->rchild);  // 递归访问右子树结点
}

/*
*	功能:中序遍历二叉树
*	输入:二叉链表的根节点
*	输出:无
*/
void inOrderTraverse(BTnode *node)
{
	if(node==NULL)
		return ;
	inOrderTraverse(node->lchild);
	printf("%c",node->data);
	inOrderTraverse(node->rchild);
}

/*
*	功能:后序遍历二叉树
*	输入:二叉链表的根节点
*	输出:无
*/
void postOrderTraverse(BTnode *node)
{
	if(node==NULL)
		return ;
	postOrderTraverse(node->lchild);
	postOrderTraverse(node->rchild);
	printf("%c",node->data);
}

void main()
{
	BTnode *root = create();  // 创建二叉链表,返回根节点
	printf("\n");

	printf("先序遍历:");  // 先序遍历二叉树
	preOrderTraverse(root);
	printf("\n");

	printf("中序遍历:");  // ..
	inOrderTraverse(root);
	printf("\n");

	printf("后序遍历:");  // ..
	postOrderTraverse(root);
	printf("\n");
}

输入:abc##d##e#f##

其二叉树结构如图示:

打印结果:

关于树和二叉树的主要知识还有二叉树的一些性质、线索二叉树:把一颗二叉树原本指向虚结点的指针域指向前驱结点或后继结点,使其形成一个双向链表、树与二叉树,森林与二叉树的转换还有树和森林的遍历等。

时间: 2024-10-11 11:26:27

数据结构:树与二叉树的相关文章

数据结构---树、二叉树、森林

1.基本术语: 度:有两种度"结点的度"与"树的度".结点的度指的是一个结点子树的个数:树的度是指树中结点度的最大值. 叶子结点:指的是没有子树的结点. 层:树是有层次的,一般根结点为第0层.规定根结点到某结点的路径长度为该结点的层数. 深度:树中结点的最大层数 兄弟:同一双亲的结点,互为兄弟 堂兄弟:双亲在同一层次的结点,互为堂兄弟 祖先:从根结点到该结点的路径上的所有结点都是该结点的祖先. 子孙:以某一结点为根的子树上的所有结点都是该结点的子孙 森林:n棵互不相

数据结构--树,二叉树

树和二叉树用来表示数据之间一对多的关系,而线性表,栈,队列都是线性的数据结构,用来表示一对一的关系. 树只有一个根节点,根也有子节点,子节点又对应多个或者一个子节点. 根节点没有父节点. 同一个节点有可能既是父节点,又是子节点. 普通节点含有子节点,叶子界面没有子节点. 节点:树的基本单位. 节点的度:节点子树的个数. 树的度:所有节点的度的最大值. 叶子节点,无子节点的节点,即度为0的节点. 分支节点,有子节点的节点为分支节点. 节点层次,根节点1,以此类推. 输的深度:节点最大层次. 有序树

浅谈数据结构-树和二叉树之间关系

树都可用二叉链表作为存储结构,对比各自的结点结构可以看出,以二叉链表作为媒介可以导出树和二叉树之间的一个对应关系. ◆ 从物理结构来看,树和二叉树的二叉链表是相同的,只是对指针的逻辑解释不同而已. ◆ 从树的二叉链表表示的定义可知,任何一棵和树对应的二叉树,其右子树一定为空. 1 树转换成二叉树 对于一般的树,可以方便地转换成一棵唯一的二叉树与之对应.将树转换成二叉树在"孩子兄弟表示法"中已给出,其详细步骤是: ⑴ 加虚线.在所有兄弟结点之间加线. ⑵ 去连线.只保留大孩子(除最左的第

数据结构 -树和二叉树

树的主要内容 树型结构:非线性结构,以分支关系定义的层次结构. 主要内容: 树和二叉树的概念.性质 二叉树的存储 二叉树的遍历 线索二叉树 树与二叉树的转化 Huffman树(最优树) 树的定义 树(Tree)是n(n≧0)个结点的有限集合T,若n=0时称为空树,否则: ⑴ 有且只有一个特殊的称为树的根(Root)结点: ⑵ 若n>1时,其余的结点被分为m(m>0)个互不相交的子集 T1, T2, T3-Tm,其中每个子集本身又是一棵树,称其为根的子树(Subtree). 这是树的递归定义,即

C#数据结构—树和二叉树

线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系.树形结构在现实世界中广泛存在,如家族的家谱.一个单位的行政机构组织等都可以用树形结构来形象地表示.树形结构在计算机领域中也有着非常广泛的应用,如 Windows 操作系统中对磁盘文件的管理.编译程序中对源程序的语法结构的表示等都采用树形结构.在数据库系统中,树形结构也是数据的重要组织形式之一.树形结构有树和二叉树两种,树的操作实现比较复杂,但树可以转换为二叉树进行处理

数据结构-树与二叉树

一.树的定义与性质 <1>定义 结点(node):树枝分叉处.树叶.树根 根结点(root):树根 叶子结点(leaf):叶子结点 边(edge):茎干和树枝 子结点(child) 子树(subtree) <2>性质 树可以没有结点,把这种情况下称为空树(empty tree) 树的层次(layer),从根结点开始算起来,即根结点为第一层 把结点的子树棵树称为结点的度(degree),而树的中结点的最大的度称为树的度(也称为树的宽度) 对于有n个结点的树的边一定是n-1 叶子结点被

数据结构—树(二叉树)

#define _CRT_SECURE_NO_WARNINGS 1 //树:非线性的数据结构,由有限个节点组成一个具有层次关系的集合.像是一颗倒挂的树,所以叫树. //树的相关概念: //1.节点的度:一个节点含有的子树的个数成为节点的度 //2.叶节点(终端节点):度为0的节点称为终端节点,(子节点为空的节点) //3.非终端节点(分支节点):度不为0的节点,即(子节点不为空的节点) //4.双亲节点(父节点):若一个节点含有子节点,称该节点为子节点的父节点 //5.孩子节点(子节点):一个节

python数据结构树和二叉树简介

一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树的递归定义:树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:(1)有且仅有一个特定的称为根(Root)的结点:(2)其余的结点可分为m(m≥0)个互不相交的子集Tl,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subree). 二.二叉树的定义 二叉树是由n(n≥0)个结点组成的有限集合.每个结点最多有两个子树的有序树

数据结构----树、二叉树----c++ &amp;&amp; python

树结构,尤其是二叉树结构是算法中常遇见的,这里根据学习过程做一个总结. 二叉树所涉及到的知识点有:满二叉树与完全二叉树.节点数目的关系.节点数与二叉树高度的关系.层次遍历.深度优先遍历.广度优先遍历等等. 这里对二叉树的基本结构实现c++版本以及python版本的代码,并且实现二叉树的前中后序遍历过程以及前中.中后序列创建唯一二叉树的过程. 1.C++版本实现 基本结构: http://www.cnblogs.com/elleniou/archive/2012/05/03/2480042.htm

数据结构学习笔记(树、二叉树)

树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 对于树的定义还需要强调两点:1.n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点.2.m>0时,子树的个数没有限制,但它们一定是互不相交的. 结点