树的基本知识

1.树的定义:

(1)有且只有一个称为根的节点。

(2)有若干个互不相交的子树,这些子树本身也是一棵树。

eg:

2.通俗的定义:

(1)树由节点和边组成。

(2)每个节点只有一个父节点但可以有多个子节点。

(3)根节点没有父节点。

3.树的一些名词:

(1)节点

(2)父节点

(3)子节点

(4)子孙

(5)堂兄弟

(6)深度:从根节点到最低层节点的层数称之为深度,根节点是第一层。

 (7)叶子节点:没有子节点的节点。

(8)非终端节点:即非叶子节点。

(9)度:子节点的个数成为度。(树的度为整个树中含有最多子节点的个数。)

 

4.树的分类:

(1)一般树:任意一个节点的子节点个数都不受限制。

(2)二叉树:(有序树)任意节点的子节点个数最多只有两个,且子节点的位置不可更改。(左子节点,右子节点的位置不可更改)

二叉树的分类:

a.一般二叉树

b.满二叉树:在不增加树的层次的前提下,无法再添加一个节点的二叉树。

 (3)完全二叉树:如果只是删除满二叉树最底层最右边的连续若干个节点,这样形成的二叉树就是完全二叉树。

eg:

满二叉树是完全二叉树的一个特例。

 

 5.树的存储

(1)二叉树的存储

a.连续存储(完全二叉树)

b.链式存储

 

eg:如果只是保存树的有效节点,无法知道原本的树的结构。

6.二叉树是非线性的数据结构,在存储时,把非线性转化为线性,有以下三种方法:

(1)先序遍历

(2)中序遍历

(3)后序遍历

 

7.将普通树转化为完全二叉树,用数组来存储二叉树的优点:

(1)已知节点的个数就可以知道层数。

(2)已知节点的编号,可以知道父节点和子节点。

(3)查找某个节点的父节点和子节点。(包括判断有没有)

 

缺点:占用内存过大。

 

8.链式存储

n个节点,浪费n+1空间(线性浪费)。

 

9.一般树的存储

(1)双亲表示法(求父节点方便)

(2)孩子表示法(求子节点方便)

(3)双亲孩子表示法(求父节点和子节点都方便)

(4)二叉树表示法(也叫孩子兄弟链表表示法)

             把一个普通树转化为二叉树来存储。具体的转化方法:设法保证任意一个节点的左指针域指向它的第一个孩子,右指针域指向它的下一个兄弟。

 

 

 

eg:

10.森林的存储——转化为二叉树存储

以下三棵树组成森林:

转化为二叉树:

11.二叉树的操作

(1)遍历。

(2)已知两种遍历序列求原始二叉树。

12.遍历分以下三种:

(1)先序遍历:先访问根节点,再先序访问左子树,再先序访问右子树。

先序:A-B-D-E-C-F-G

(2)中序遍历:[中间访问根节点]中序遍历左子树,再访问根节点,再中序遍历右子树。

eg:

中序:B-D-C-E-A-L-F-N-Q-M

eg:

中序:B-D-C-A-M-Q-E-L-N

(3)后序遍历:[最后访问根节点]先后序遍历左子树,在后序遍历右子树,再访问根节点。

eg:

后序:B-D-M-F-L-E-C-A

13.已知两种遍历序列求原始二叉树                           

      已知先序遍历和中序遍历,或是已知中序遍历和后序遍历可以推算出原始二叉树。注意:已知先序和后序是不能推算出原始二叉树的。

eg:(1)已知先序和中序求后序。

先序:ABCDEFGH

中序:BDCEAFHG

求后序?

解题思路:先序中最先出现的是根节点,从中序可以确定左右子树,然后再在先序中确立接下里的根节点。

后序:DECBHGFA

(2)已知中序和后序求先序。

中序:BDCEAFHG

后序:DECBHGFA

求先序?

解题思路:先根据后序找到根节点,然后根据中序找到左右子树,在后序中最后出现的为根节点。

先序:ABCDEFGH

14.树的应用

(1)树是数据库中数据组织的一种重要形式。eg:图书馆图书的分类。

(2)操作系统子父进程的关系本身就是一棵树。

(3)面向对象语言中类的继承关系本身就是一棵树。

(4)赫夫曼树。

原文地址:https://www.cnblogs.com/LinSL/p/6375083.html