二叉树的概念、存储结构和遍历(软考)

阅读目录

一、树的基本概念
二、二叉树的概念
三、二叉树的存储结构
四、二叉树的遍历
五、软考真题练习

一、树的基本概念

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

双亲、孩子和兄弟:结点的子树的根称为该结点的孩子,相应地,该结点称为其子结点的双亲。具有相同双亲的结点互为兄弟。例如图中,结点A是树根, B、 C、 D是A的孩子结点, B、C、D互为兄弟; E、F互为兄弟, B是E和F的双亲。
结点的度:一个结点的子树的个数记为该结点的度。例如图中, B的度为2, C的度为0, D的度为1.
叶子结点:也称为终端结点,指度为零的结点。例如图中, E、F、C、G都是叶子结点。
内部结点:度不为零的结点称为分支结点或非终端结点。除根结点之外,分支结点也称为内部结点。例如图中,B、D都是内部结点。
结点的层次:根为第一层,根的孩子为第二层,依此类推,若某结点在第1层,则其孩子结点就在第i+1层。例如图中, A在第1层, B、C、D在第2层,和G在第3层。
树的高度:一棵树的最大层数记为树的高度(或深度),例如,图所示的树高度为3 。
有序(无序)树:若将树中结点的各子树看成是从左到右有次序关系,即不能交换次序,则称该树为有序树,否则称为无序树。
森林:是m(m>=0)棵互不相交的树的集合。

二、二叉树的概念

1、二叉树的基本概念

二叉树是n(n>=0)个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两颗不相交的、分别称为左子树和右子树所组成。

2、二叉树的5种基本形态:

(1)、空二叉树
(2)、只有一个根节点
(3)、根节点只有左子树
(4)、根节点只有右子树
(5)、.根节点既有左子树,又有右子树

3、二叉树的特点

  • 每个结点最多只有两颗子树,暨不存在结点度大于2的结点。
  • 子树有左右之分,不能颠倒。

4、二叉树的性质

性质1:二叉树第i层上的结点数目最多为2i-1(i>=1)
性质2:深度为k的二叉树至多有2k-1个结点(k>=1)
性质3:包含n个结点的二叉树的高度至少为(log2n)+1
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1

5、完全二叉树以及满二叉树的概念

  • 满二叉树:深度为k的二叉树y有2k-1个结点

在这里插入图片描述

  • 完全二叉树:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下层的叶结点集中在靠左的若干位置上。
  • 完全二叉树的特点
    (1)叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。
    (2)完全二叉树结点树n满足2k-1-1<n<=2k-1。
    (3)满二叉树一定是完全二叉树,反之不成立!
    在这里插入图片描述

三、二叉树的存储结构

1、顺序存储

  • 二叉树的顺序存储结构
    用一组地址连续的存储单元,以层序顺序存放二叉树的数据元素,结点的相对位置蕴含着结点之间的关系。完全二叉树的顺序存储

  • 一般二叉树的顺序存储
    把一般的二叉树先补成完全二叉树,然后按照完全二叉树的顺序存储方式进行存储,而新补上去的结点只占位置,不存放结点数据。
    在这里插入图片描述

2、链式存储

  • 二叉链表

在这里插入图片描述

  • 三叉链表
    在这里插入图片描述

四、二叉树的遍历

1、先序遍历

(1)访问根结点
(2)先序遍历左子树
(3)先序遍历右子树
在这里插入图片描述
c语言代码

void inOrder(BiTree root)
{	if(root==NULL) return; /*遇到空树(子树)时返回*/
	else
	{	
		printf("%c",data);	/*访问根结点*/
		inOrder(root->lchild);	/*先序遍历根结点的左子树*/
		inOrder(root->rchild);	/*先序遍历根结点的右子树*/
	}
}

2、中序遍历

(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
在这里插入图片描述
c语言代码

void inOrder(BiTree root)
{	if(root==NULL) return; /*遇到空树(子树)时返回*/
	else
	{	
		inOrder(root->lchild);	/*中序遍历根结点的左子树*/
		printf("%c",data);	/*访问根结点*/
		inOrder(root->rchild);	/*中序遍历根结点的右子树*/
	}
}

3、后序遍历

(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根结点
在这里插入图片描述
c语言代码

void inOrder(BiTree root)
{	if(root==NULL) return; /*遇到空树(子树)时返回*/
	else
	{	
		inOrder(root->lchild);	/*后序遍历根结点的左子树*/
		inOrder(root->rchild);	/*后序遍历根结点的右子树*/
		printf("%c",data);	/*访问根结点*/
	}
}

4、、层次遍历

在这里插入图片描述
层次遍历:ABCDEFG

c语言代码

void levelOrder(BiTree root)
{
	BiTree p;
	initQueue(0);	/*创建并初始化一个BiTree型空队列*/
	EnterQueue(0,root);	/*将结点指针root入队*/
	while(!Empty (0)	/*只要队列不为空加循环*/
	{
		DelQueue(0,p);	/*队头元素出队,并用p指向该出对元素*/
		printf("%c",p->data);/*访问p指向的结点*/
		if(p->lchild)
			EnterQueue(0,p->lchild);	/*结点*p的左子树入队*/
		if(p->rchild)
			EnterQueue(0,p->rchile);	/*结点*p的右子树入队*/
	}
}		

例如,求下面二叉树的各种遍历
在这里插入图片描述

前序遍历:A B D E G H C F

中序遍历:D B G E H A C F

后序遍历:D G H E B F C A

层次遍历:A B C D E F G H

4、由先序和中序遍历序列建立二叉树

在这里插入图片描述

知道先序遍历和中序遍历可以建立二叉树
知道后序遍历和中序遍历可以建立二叉树
知道先序遍历和后序遍历不可以建立二叉树

五、软考真题练习

1、
先序遍历:ABDCE
中序遍历:BDAEC
在这里插入图片描述
2、
先序遍历:ABCD
后序遍历:CDBA
在这里插入图片描述
3、
先序遍历:ABDCEFG
中序遍历:BDACFGE
在这里插入图片描述

4、先序遍历:ABCD,中序遍历:BADC,求后序遍历?
后序遍历:BDCA

发布了33 篇原创文章 · 获赞 13 · 访问量 2768

猜你喜欢

转载自blog.csdn.net/weixin_44947339/article/details/104154432