二叉树的基本概念、存储结构和(递归)遍历方式

简介: 二叉树的基本概念、存储结构和(递归)遍历方式

二叉树

度为二的数

二叉树的子树有左右之分

特殊二叉树

1.斜二叉树(类似链表)

2.完美二叉树(满二叉树)(每个结点都有里两个儿子,除了最底下的结点的叶节点没有儿子

3.完全二叉树:从上往下,从左往右编号,与满二叉树必须完全一致只能少最后面的几个结点,不能有空缺

二叉树的几个重要性质

1.一个二叉树第i层的最大结点数为2^(i-1)

2.深度为K的二叉树有最大结点总数为2^k - 1

3.对任何非空二叉树,若n0表示叶节点的个数,n1表示度为1的结点个数n2表示度为2的结点个数,那么存在这样的关系:n0 = n2 + 1;

总的节点数 n0 + n1 + n2

边的数量 n0 + n1 + n2 - 1 = 0*n0 + 1*n1 + n2 * 2 ----> n0 = n2 + 1

二叉树的抽象数据类型定义

数据对象集:一个有穷的结点集合

若不为空,则由根节点和其左、右二叉子树组成

操作集:

1.判断二叉树是否为空:Boolean IsEmpty(BinTree BT)

2.遍历、按某顺序访问每个结点:void Traversal(BinTree BT)

3.创建一个二叉树:BinTree CreatBinTree()


常见的遍历方法:

void PreOrderTraversal(BinTree BT):先序---根、左子树、右子树

void InOrderTraversal(BinTree BT):中序---左子树、根、右子树

void PostOrderTraversal(BinTree BT):后序---左子树、右子树、根

void LevelOrderTraversal(BinTree BT):层次遍历,从上到下,从左到右

二叉树的存储结构:

1.顺序存储结构(数组)

完全二叉树: 按从上至下、从左到右顺序存储

n个结点的完全二叉树的结点父子关系

1.非根节点(序号i > 1)的父节点的序号是int(i / 2)

2.结点(序号为i)的左孩子及诶那的序号是2i(2i <= n,否则没有左孩子)

3.结点(序号为i)的右孩子结点的序号是2i+1(2i+1 <= n,否则没有右孩子)


结点 A B O C S M Q W K

序 号 1 2 3 4 5 6 7 8 9



一般二叉树也可以采用这种结构,但会造成空间浪费

结点 A B O ∧ ∧ M ∧ ∧ ∧ ∧ ∧ ∧ C

序 号 1 2 3 4 5 6 7 8 9 10 11 12 13

2.链表存储

typedef struct TreeNode *BinTree;
typedef struct BinTree Position;
struct TreeNode {
    ElementType Element;
    BinTree Left;
    BinTree Right;
}

二叉树的遍历

1.先序遍历:

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

1.访问根节点

2.先序遍历其左子树

3.先序遍历其右子树

1456655-20180821180522112-1121009525.png


1 void PreOrderTraversal(BinTree BT)
2 {
3     if(BT)
4     {
5         printf("%d", BT->data);
6         PreOrderTraversal(BT->Left);
7         PreOrderTraversal(BT->Right);
8     }
9 }

2.中序遍历

遍历过程:D B E F A G H C I

(1)中序遍历其左子树

(2)访问根节点

(3)中序遍历其右子树

1 void PreOrderTraversal(BinTree BT)
2 {
3   if(BT)
4   {
5     PreOrderTraversal(BT->Left);
6     printf("%d", BT->data);
7     PreOrderTraversal(BT->Right);
8   }
9 }

3.后序遍历

遍历过程: D E F B H G I C A

(1)后序遍历其左子树

(2)后序遍历其右子树

(3)访问根节点

1 void PreOrderTraversal(BinTree BT)
2 {
3   if(BT)
4   {
5     PreOrderTraversal(BT->Left);
6     PreOrderTraversal(BT->Right);
7     printf("%d", BT->data);
8   }
9 }

1456655-20180821180821208-1631597103.png

先序、中序和后序遍历过程:遍历过程中经过结点的路线都是一样,只是访问各节点的时机不同

图中在从入口到出口的曲线上用 三种符号分别标

记出了 先序、中序和后序刻 访问各结点的时刻

1456655-20180821180838648-1840078905.png

相关文章
|
4月前
|
存储 算法
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
33 0
|
5月前
【数据结构】二叉树(遍历,递归)
【数据结构】二叉树(遍历,递归
30 2
|
4月前
|
算法
【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)
【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)
26 0
|
4月前
|
存储 算法
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
|
4月前
|
算法
数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)
数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)
31 0
|
算法
【算法】递归解决各种数据结构的遍历问题
【算法】递归解决各种数据结构的遍历问题
49 0
|
5月前
|
算法 C++
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
35 0
|
11月前
|
算法
【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)
【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)
67 0
|
11月前
|
存储 算法
【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解
【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解
58 0
|
存储 算法 C语言
【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式
与之前链表的Node类似,所以就不细讲了(给定一个值,malloc其节点,将值存入x,其左右指针置空,返回这个节点值)
77 0