二叉树顺序存储、链式存储及之间的转化


二叉树顺序存储、链式存储及之间转化与遍历。

二叉树的存储可用顺序存储方式和链式存储方式,其中顺序存储时存储地址相邻,空间利用率高,但不易进行元素的增删等操作。而链式存储方式的元素可随意存放,但其存储空间所占为数据元素和指针所占空间,存储空间利用率低。

数据图如下

在这里插入图片描述

完整程序–转化算法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include<iostream>
typedef char datatype;//将队列的节点类型设置为字符型
using namespace std;

typedef struct node
{
datatype data;
struct node* rchild, * lchild;
}BTNode, * BinTree;

typedef struct elem
{
datatype data;
int lchild, rchild;
int tag;//标记是否已申请节点
BTNode* link;
}element;

/*函数声明*/
element* CreateBinaryTree(int n);//创建顺序结构二叉树
BinTree exchange(element* ele, int n);//二叉树线性结构转为二叉结构
void PreOrder(BTNode* p);//前序遍历 (递归)
void InOrder(BTNode* p);//中序遍历 (递归)
void PostOrder(BTNode* p);//后续遍历(递归)

int main()
{
BinTree root;
element* ele;
int n;
cout << "创建树的节点为:";
cin >> n;
cout << endl;
ele = CreateBinaryTree(n);
root = exchange(ele, n);
PreOrder(root);
InOrder(root);
PostOrder(root);
}

//创建顺序结构二叉树
element* CreateBinaryTree(int n)
{
element* ele = new element[n];
for (int i = 0; i < n; i++)
{
cout << "依次输入第" << i << "个节点的数据 左子树 右子树";
cin >> ele[i].data >> ele[i].lchild >> ele[i].rchild;
ele[i].tag = 0;
ele[i].link = NULL;
cout << endl;
}
return ele;
}

//二叉树线性结构转为二叉结构
BinTree exchange(element* ele, int n)
{
int i, j;
BTNode* p, * rchild, * lchild;
for (int i = 0; i < n; i++)
{
if (ele[i].tag == 0)
{
p = new BTNode;
ele[i].link = p;
ele[i].tag = 1;
p->data = ele[i].data;
}
else
{
p = ele[i].link;
}
if (ele[i].lchild != -1)//如果当前节点左子树存在
{
j = ele[i].lchild;
lchild = new BTNode;
ele[j].link = lchild;
ele[j].tag = 1;
lchild->data = ele[j].data;
p->lchild = lchild;
}
else
{
p->lchild = NULL;
}
if (ele[i].rchild != -1)//如果当前节点右子树存在
{
j = ele[i].rchild;
rchild = new BTNode;
ele[j].link = rchild;
ele[j].tag = 1;
rchild->data = ele[j].data;
p->rchild = rchild;
}
else
{
p->rchild = NULL;
}
}
return ele[0].link;
}

//前序遍历 (递归)
void PreOrder(BTNode* p)
{
if (p != NULL)
{
cout << p->data;
PreOrder(p->lchild);
PreOrder(p->rchild);
}
}

//中序遍历 (递归)
void InOrder(BTNode* p)
{
if (p != NULL)
{
InOrder(p->lchild);
cout << p->data;
InOrder(p->rchild);
}
}

//后续遍历(递归)
void PostOrder(BTNode* p)
{
if (p != NULL)
{
PostOrder(p->lchild);
PostOrder(p->rchild);
cout << p->data;
}
}

数据图的运行结果

在这里插入图片描述

在这里插入图片描述
如有问题,欢迎指正。

相关参考资料《数据结构》—周颜军


 Previous
八皇后问题 八皇后问题
八皇后问题(链接) 努比亚和苏丹没有子女,所以他要从一些有集成资格的继承者中挑选一个出来继承王位。他希望这个继承者足够聪明,所以他准备了一个西洋棋盘,上面的每个格子中均有一个 $1-99$ 的数字。他又准备了 $8$ 个皇后棋子。
2021-10-15 cyy
Next 
二叉排序树的实现 二叉排序树的实现
问题描述及要求 产生一个菜单驱动的演示程序,用以说明二叉树的使用。元素由单个键组成,键为单个字符。用户能演示的二叉树基本操作至少包括:构造二叉树,按先序、中序、后序、层序遍历这棵二叉树,求二叉树的深度、宽度,统计度为0,1,2
2021-10-15 cyy
  TOC