数据结构 创建二叉树
- 格式:ppt
- 大小:487.50 KB
- 文档页数:36
二叉树的建立与基本操作二叉树是一种特殊的树形结构,它由节点(node)组成,每个节点最多有两个子节点。
二叉树的基本操作包括建立二叉树、遍历二叉树、查找二叉树节点、插入和删除节点等。
本文将详细介绍二叉树的建立和基本操作,并给出相应的代码示例。
一、建立二叉树建立二叉树有多种方法,包括使用数组、链表和前序、中序、后序遍历等。
下面以使用链表的方式来建立二叉树为例。
1.定义二叉树节点类首先,定义一个二叉树节点的类,包含节点值、左子节点和右子节点三个属性。
```pythonclass Node:def __init__(self, value):self.value = valueself.left = Noneself.right = None```2.建立二叉树使用递归的方法来建立二叉树,先构造根节点,然后递归地构造左子树和右子树。
```pythondef build_binary_tree(lst):if not lst: # 如果 lst 为空,则返回 Nonereturn Nonemid = len(lst) // 2 # 取 lst 的中间元素作为根节点的值root = Node(lst[mid])root.left = build_binary_tree(lst[:mid]) # 递归构造左子树root.right = build_binary_tree(lst[mid+1:]) # 递归构造右子树return root```下面是建立二叉树的示例代码:```pythonlst = [1, 2, 3, 4, 5, 6, 7]root = build_binary_tree(lst)```二、遍历二叉树遍历二叉树是指按照其中一规则访问二叉树的所有节点,常见的遍历方式有前序遍历、中序遍历和后序遍历。
1.前序遍历前序遍历是指先访问根节点,然后访问左子节点,最后访问右子节点。
```pythondef pre_order_traversal(root):if root:print(root.value) # 先访问根节点pre_order_traversal(root.left) # 递归访问左子树pre_order_traversal(root.right) # 递归访问右子树```2.中序遍历中序遍历是指先访问左子节点,然后访问根节点,最后访问右子节点。
《数据结构》实验报告班级:学号:姓名:实验四二叉树的基本操作实验环境:Visual C++实验目的:1、掌握二叉树的二叉链式存储结构;2、掌握二叉树的建立,遍历等操作。
实验内容:通过完全前序序列创建一棵二叉树,完成如下功能:1)输出二叉树的前序遍历序列;2)输出二叉树的中序遍历序列;3)输出二叉树的后序遍历序列;4)统计二叉树的结点总数;5)统计二叉树中叶子结点的个数;实验提示://二叉树的二叉链式存储表示typedef char TElemType;typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;一、程序源代码#include <stdio.h>#include <stdlib.h>#define MAXSIZE 30typedef char ElemType;typedef struct TNode *BiTree;struct TNode {char data;BiTree lchild;BiTree rchild;};int IsEmpty_BiTree(BiTree *T) { if(*T == NULL)return 1;elsereturn 0;}void Create_BiTree(BiTree *T){char ch;ch = getchar();//当输入的是"#"时,认为该子树为空if(ch == '#')*T = NULL;//创建树结点else{*T = (BiTree)malloc(sizeof(struct TNode)); (*T)->data = ch; //生成树结点//生成左子树Create_BiTree(&(*T)->lchild);//生成右子树Create_BiTree(&(*T)->rchild);}}void TraverseBiTree(BiTree T) { //先序遍历if(T == NULL)return;else {printf("%c ",T->data);TraverseBiTree(T->lchild);TraverseBiTree(T->rchild);}}void InOrderBiTree(BiTree T) { //中序遍历if(NULL == T)return;else {InOrderBiTree(T->lchild);printf("%c ",T->data);InOrderBiTree(T->rchild);}}void PostOrderBiTree(BiTree T) {if(NULL == T)return;else {InOrderBiTree(T->lchild);InOrderBiTree(T->rchild);printf("%c ",T->data);}}int TreeDeep(BiTree T) {int deep = 0;if(T){int leftdeep = TreeDeep(T->lchild);int rightdeep = TreeDeep(T->rchild);deep = leftdeep+1 > rightdeep+1 ? leftdeep+1 : rightdeep+1;}return deep;}int Leafcount(BiTree T, int &num) {if(T){if(T->lchild ==NULL && T->rchild==NULL){num++;printf("%c ",T->data);}Leafcount(T->lchild,num);Leafcount(T->rchild,num);}return num;}void LevelOrder_BiTree(BiTree T){//用一个队列保存结点信息,这里的队列采用的是顺序队列中的数组实现 int front = 0;int rear = 0;BiTree BiQueue[MAXSIZE];BiTree tempNode;if(!IsEmpty_BiTree(&T)){BiQueue[rear++] = T;while(front != rear){//取出队头元素,并使队头指针向后移动一位tempNode = BiQueue[front++];//判断左右子树是否为空,若为空,则加入队列 if(!IsEmpty_BiTree(&(tempNode->lchild))) BiQueue[rear++] = tempNode->lchild;if(!IsEmpty_BiTree(&(tempNode->rchild))) BiQueue[rear++] = tempNode->rchild;printf("%c ",tempNode->data);}}}int main(void){BiTree T;BiTree *p = (BiTree*)malloc(sizeof(BiTree));int deepth,num=0 ;Create_BiTree(&T);printf("先序遍历二叉树:\n");TraverseBiTree(T);printf("\n");printf("中序遍历二叉树:\n");InOrderBiTree(T);printf("\n");printf("后序遍历二叉树:\n");PostOrderBiTree(T);printf("\n层次遍历结果:");LevelOrder_BiTree(T);printf("\n");deepth=TreeDeep(T);printf("树的深度为:%d",deepth);printf("\n");printf("树的叶子结点为:");Leafcount(T,num);printf("\\n树的叶子结点个数为:%d",num);return 0;}二、运行结果(截图)三、遇到的问题总结通过死循环的部分可以看出,在判断时是不能进入结点为空的语句中的,于是从树的构建中寻找问题,最终发现这一条语句存在着问题:这里给T赋值为空,也就是给整个结构体地址赋值为空,但是我们的目的是给该结构体中的内容,即左孩子的地址指向的内容赋为空。
最优⼆叉树(哈夫曼树)的构建及编码参考:数据结构教程(第五版)李春葆主编⼀,概述1,概念 结点的带权路径长度: 从根节点到该结点之间的路径长度与该结点上权的乘积。
树的带权路径长度: 树中所有叶结点的带权路径长度之和。
2,哈夫曼树(Huffman Tree) 给定 n 个权值作为 n 个叶⼦结点,构造⼀棵⼆叉树,若该树的带权路径长度达到最⼩,则称这样的⼆叉树为最优⼆叉树,也称为哈夫曼树。
哈夫曼树是带权路径长度最短的树,权值较⼤的结点离根较近。
⼆,哈夫曼树的构建1,思考 要实现哈夫曼树⾸先有个问题摆在眼前,那就是哈夫曼树⽤什么数据结构表⽰? ⾸先,我们想到的肯定数组了,因为数组是最简单和⽅便的。
⽤数组表⽰⼆叉树有两种⽅法: 第⼀种适⽤于所有的树。
即利⽤树的每个结点最多只有⼀个⽗节点这种特性,⽤ p[ i ] 表⽰ i 结点的根节点,进⽽表⽰树的⽅法。
但这种⽅法是有缺陷的,权重的值需要另设⼀个数组表⽰;每次找⼦节点都要遍历⼀遍数组,⼗分浪费时间。
第⼆种只适⽤于⼆叉树。
即利⽤⼆叉树每个结点最多只有两个⼦节点的特点。
从下标 0 开始表⽰根节点,编号为 i 结点即为 2 * i + 1 和 2 * i + 2,⽗节点为 ( i - 1) / 2,没有⽤到的空间⽤ -1 表⽰。
但这种⽅法也有问题,即哈夫曼树是从叶结点⾃下往上构建的,⼀开始树叶的位置会因为⽆法确定⾃⾝的深度⽽⽆法确定,从⽽⽆法构造。
既然如此,只能⽤⽐较⿇烦的结构体数组表⽰⼆叉树了。
typedef struct HTNode // 哈夫曼树结点{double w; // 权重int p, lc, rc;}htn;2,算法思想 感觉⽐较偏向于贪⼼,权重最⼩的叶⼦节点要离根节点越远,⼜因为我们是从叶⼦结点开始构造最优树的,所以肯定是从最远的结点开始构造,即权重最⼩的结点开始构造。
所以先选择权重最⼩的两个结点,构造⼀棵⼩⼆叉树。
然后那两个最⼩权值的结点因为已经构造完了,不会在⽤了,就不去考虑它了,将新⽣成的根节点作为新的叶⼦节加⼊剩下的叶⼦节点,⼜因为该根节点要能代表整个以它为根节点的⼆叉树的权重,所以其权值要为其所有⼦节点的权重之和。
数据结构树创建树是一种非常常见的数据结构,具有层次关系和递归特性。
在计算机科学、算法和数据结构中,树的应用非常广泛,例如树形结构的操作、搜索、排序等等。
树的创建可以通过多种方法实现,以下是几种常见的创建方式。
1.静态创建(手动创建)。
静态创建是一种最基本的创建方式,也是最直观的创建方式。
在静态创建中,我们手动构建树的每一个节点并链接它们。
例如,下面是一个手动创建的示例树:```。
class TreeNode:。
def __init__(self, value):。
self.value = value。
self.left = None。
self.right = None。
root = TreeNode(1)。
root.left = TreeNode(2)。
root.right = TreeNode(3)。
root.left.left = TreeNode(4)。
root.left.right = TreeNode(5)。
```。
2.动态创建(代码实现)。
动态创建是一种通过代码实现的树的创建方式,在动态创建中,我们根据输入的数据动态生成树的节点,使得树生成的过程自动化。
例如,下面是动态创建一颗二叉树的示例代码:```。
class TreeNode:。
def __init__(self, value=None, left=None, right=None):。
self.value = value。
self.left = left。
self.right = right。
def insert_left(self, value):。
if self.left is None:。
self.left = TreeNode(value)。
else:。
node = TreeNode(value)。
node.left = self.left。
self.left = node。
def insert_right(self, value):。
数据结构⼊门-树的遍历以及⼆叉树的创建树定义:1. 有且只有⼀个称为根的节点2. 有若⼲个互不相交的⼦树,这些⼦树本⾝也是⼀个树通俗的讲:1. 树是有结点和边组成,2. 每个结点只有⼀个⽗结点,但可以有多个⼦节点3. 但有⼀个节点例外,该节点没有⽗结点,称为根节点⼀、专业术语结点、⽗结点、⼦结点、根结点深度:从根节点到最底层结点的层数称为深度,根节点第⼀层叶⼦结点:没有⼦结点的结点⾮终端节点:实际上是⾮叶⼦结点度:⼦结点的个数成为度⼆、树的分类⼀般树:任意⼀个结点的⼦结点的个数都不受限制⼆叉树:任意⼀个结点的⼦结点个数最多是两个,且⼦结点的位置不可更改⼆叉数分类:1. ⼀般⼆叉数2. 满⼆叉树:在不增加树层数的前提下,⽆法再多添加⼀个结点的⼆叉树3. 完全⼆叉树:如果只是删除了满⼆叉树最底层最右边的连续若⼲个结点,这样形成的⼆叉树就是完全⼆叉树森林:n个互不相交的树的集合三、树的存储⼆叉树存储连续存储(完全⼆叉树)优点:查找某个结点的⽗结点和⼦结点(也包括判断有没有⼦结点)速度很快缺点:耗⽤内存空间过⼤链式存储⼀般树存储1. 双亲表⽰法:求⽗结点⽅便2. 孩⼦表⽰法:求⼦结点⽅便3. 双亲孩⼦表⽰法:求⽗结点和⼦结点都很⽅便4. ⼆叉树表⽰法:把⼀个⼀般树转化成⼀个⼆叉树来存储,具体转换⽅法:设法保证任意⼀个结点的左指针域指向它的第⼀个孩⼦,右指针域指向它的兄弟,只要能满⾜此条件,就可以把⼀个⼀般树转化为⼆叉树⼀个普通树转换成的⼆叉树⼀定没有右⼦树森林的存储先把森林转化为⼆叉树,再存储⼆叉树四、树的遍历先序遍历:根左右先访问根结点,再先序访问左⼦树,再先序访问右⼦树中序遍历:左根右中序遍历左⼦树,再访问根结点,再中序遍历右⼦树后续遍历:左右根后续遍历左⼦树,后续遍历右⼦树,再访问根节点五、已知两种遍历求原始⼆叉树给定了⼆叉树的任何⼀种遍历序列,都⽆法唯⼀确定相应的⼆叉树,但是如果知道了⼆叉树的中序遍历序列和任意的另⼀种遍历序列,就可以唯⼀地确定⼆叉树已知先序和中序求后序先序:ABCDEFGH中序:BDCEAFHG求后序:这个⾃⼰画个图体会⼀下就可以了,⾮常简单,这⾥简单记录⼀下1. ⾸先根据先序确定根,上⾯的A就是根2. 中序确定左右,A左边就是左树(BDCE),A右边就是右树(FHG)3. 再根据先序,A左下⾯就是B,然后根据中序,B左边没有,右边是DCE4. 再根据先序,B右下是C,根据中序,c左下边是D,右下边是E,所以整个左树就确定了5. 右树,根据先序,A右下是F,然后根据中序,F的左下没有,右下是HG,6. 根据先序,F右下为G,然后根据中序,H在G的左边,所以G的左下边是H再来⼀个例⼦,和上⾯的思路是⼀样的,这⾥就不详细的写了先序:ABDGHCEFI中序:GDHBAECIF已知中序和后序求先序中序:BDCEAFHG后序:DECBHGFA这个和上⾯的思路是⼀样的,只不过是反过来找,后序找根,中序找左右树简单应⽤树是数据库中数据组织⼀种重要形式操作系统⼦⽗进程的关系本⾝就是⼀棵树⾯向对象语⾔中类的继承关系哈夫曼树六、⼆叉树的创建#include <stdio.h>#include <stdlib.h>typedef struct Node{char data;struct Node * lchild;struct Node * rchild;}BTNode;/*⼆叉树建⽴*/void BuildBT(BTNode ** tree){char ch;scanf("%c" , &ch); // 输⼊数据if(ch == '#') // 如果这个节点的数据是#说明这个结点为空*tree = NULL;else{*tree = (BTNode*)malloc(sizeof(BTNode));//申请⼀个结点的内存 (*tree)->data = ch; // 将数据写⼊到结点⾥⾯BuildBT(&(*tree)->lchild); // 递归建⽴左⼦树BuildBT(&(*tree)->rchild); // 递归建⽴右⼦树}}/*⼆叉树销毁*/void DestroyBT(BTNode *tree) // 传⼊根结点{if(tree != NULL){DestroyBT(tree->lchild);DestroyBT(tree->rchild);free(tree); // 释放内存空间}}/*⼆叉树的先序遍历*/void Preorder(BTNode * node){if(node == NULL)return;else{printf("%c ",node->data );Preorder(node->lchild);Preorder(node->rchild);}}/*⼆叉树的中序遍历*/void Inorder(BTNode * node){if(node == NULL)return;else{Inorder(node->lchild);printf("%c ",node->data );Inorder(node->rchild);}}/*⼆叉树的后序遍历*/void Postorder(BTNode * node){if(node == NULL)return;else{Postorder(node->lchild);Postorder(node->rchild);printf("%c ",node->data );}}/*⼆叉树的⾼度树的⾼度 = max(左⼦树⾼度,右⼦树⾼度) +1*/int getHeight(BTNode *node){int Height = 0;if (node == NULL)return 0;else{int L_height = getHeight(node->lchild);int R_height = getHeight(node->rchild);Height = L_height >= R_height ? L_height +1 : R_height +1; }return Height;}int main(int argc, char const *argv[]){BTNode * BTree; // 定义⼀个⼆叉树printf("请输⼊⼀颗⼆叉树先序序列以#表⽰空结点:");BuildBT(&BTree);printf("先序序列:");Preorder(BTree);printf("\n中序序列:");Inorder(BTree);printf("\n后序序列:");Postorder(BTree);printf("\n树的⾼度为:%d" , getHeight(BTree));return 0;}// ABC##DE##F##G##。
以二叉树或树作为表的组织形式,称为树表,它是一类动态查找表,不仅适合于数据查找,也适合于表插入和删除操作。
常见的树表:二叉排序树平衡二叉树B-树B+树9.3.1 二叉排序树二叉排序树(简称BST)又称二叉查找(搜索)树,其定义为:二叉排序树或者是空树,或者是满足如下性质(BST性质)的二叉树:❶若它的左子树非空,则左子树上所有节点值(指关键字值)均小于根节点值;❷若它的右子树非空,则右子树上所有节点值均大于根节点值;❸左、右子树本身又各是一棵二叉排序树。
注意:二叉排序树中没有相同关键字的节点。
二叉树结构满足BST性质:节点值约束二叉排序树503080209010854035252388例如:是二叉排序树。
66不试一试二叉排序树的中序遍历序列有什么特点?二叉排序树的节点类型如下:typedef struct node{KeyType key;//关键字项InfoType data;//其他数据域struct node*lchild,*rchild;//左右孩子指针}BSTNode;二叉排序树可看做是一个有序表,所以在二叉排序树上进行查找,和二分查找类似,也是一个逐步缩小查找范围的过程。
1、二叉排序树上的查找Nk< bt->keybtk> bt->key 每一层只和一个节点进行关键字比较!∧∧p查找到p所指节点若k<p->data,并且p->lchild=NULL,查找失败。
若k>p->data,并且p->rchild=NULL,查找失败。
查找失败的情况加上外部节点一个外部节点对应某内部节点的一个NULL指针递归查找算法SearchBST()如下(在二叉排序树bt上查找关键字为k的记录,成功时返回该节点指针,否则返回NULL):BSTNode*SearchBST(BSTNode*bt,KeyType k){if(bt==NULL||bt->key==k)//递归出口return bt;if(k<bt->key)return SearchBST(bt->lchild,k);//在左子树中递归查找elsereturn SearchBST(bt->rchild,k);//在右子树中递归查找}在二叉排序树中插入一个关键字为k的新节点,要保证插入后仍满足BST性质。
二叉树结构体定义
二叉树是一种重要的数据结构,它由根节点、左子树和右子树组成。
在程序中,我们通常使用结构体来定义二叉树。
二叉树结构体通常包含三个成员变量:根节点指针、左子树指针和右子树指针。
其中,根节点指针指向二叉树的根节点,左子树指针指向左子树的根节点,右子树指针指向右子树的根节点。
二叉树结构体的定义如下:
```c
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
```
上述代码中,我们使用 typedef 关键字定义了一个名为TreeNode 的结构体类型。
结构体中包含了一个 int 型的 val 成员变量,以及两个指向 TreeNode 类型的指针 left 和 right。
通过定义二叉树结构体,我们可以轻松地创建二叉树,并对其进行操作。
- 1 -。
树和二叉树的实验报告树和二叉树的实验报告一、引言树和二叉树是计算机科学中常用的数据结构,它们在各种算法和应用中都有广泛的应用。
本实验旨在通过实际操作和观察,深入了解树和二叉树的特性和操作。
二、树的构建与遍历1. 树的概念和特性树是一种非线性的数据结构,由节点和边组成。
每个节点可以有零个或多个子节点,其中一个节点没有父节点的称为根节点。
树的特点包括层次结构、唯一根节点和无环等。
2. 树的构建在本实验中,我们使用Python语言构建了一棵树。
通过定义节点类和树类,我们可以方便地创建树的实例,并添加节点和连接节点之间的边。
3. 树的遍历树的遍历是指按照一定顺序访问树中的所有节点。
常见的遍历方式有前序遍历、中序遍历和后序遍历。
我们在实验中实现了这三种遍历方式,并观察了它们的输出结果。
三、二叉树的实现与应用1. 二叉树的概念和特性二叉树是一种特殊的树,每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉树的特点包括唯一根节点、每个节点最多有两个子节点和子节点的顺序等。
2. 二叉树的实现我们使用Python语言实现了二叉树的数据结构。
通过定义节点类和二叉树类,我们可以创建二叉树的实例,并实现插入节点、删除节点和查找节点等操作。
3. 二叉树的应用二叉树在实际应用中有很多用途。
例如,二叉搜索树可以用于实现快速查找和排序算法。
AVL树和红黑树等平衡二叉树可以用于高效地插入和删除操作。
我们在实验中实现了这些应用,并通过实际操作验证了它们的效果。
四、实验结果与讨论通过实验,我们成功构建了树和二叉树的数据结构,并实现了它们的基本操作。
通过观察和分析实验结果,我们发现树和二叉树在各种算法和应用中的重要性和灵活性。
树和二叉树的特性使得它们适用于解决各种问题,例如搜索、排序、图算法等。
同时,我们也发现了一些问题和挑战,例如树的平衡性和节点的插入和删除操作等。
这些问题需要进一步的研究和优化。
五、总结本实验通过实际操作和观察,深入了解了树和二叉树的特性和操作。
数据结构二叉树实验报告1. 引言二叉树是一种常见的数据结构,由节点(Node)和链接(Link)构成。
每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉树在计算机科学中被广泛应用,例如在搜索算法中,二叉树可以用来快速查找和插入数据。
本实验旨在通过编写二叉树的基本操作来深入理解二叉树的特性和实现方式。
2. 实验内容2.1 二叉树的定义二叉树可以用以下方式定义:class TreeNode:def__init__(self, val):self.val = valself.left =Noneself.right =None每个节点包含一个值和两个指针,分别指向左子节点和右子节点。
根据需求,可以为节点添加其他属性。
2.2 二叉树的基本操作本实验主要涉及以下二叉树的基本操作:•创建二叉树:根据给定的节点值构建二叉树。
•遍历二叉树:将二叉树的节点按照特定顺序访问。
•查找节点:在二叉树中查找特定值的节点。
•插入节点:向二叉树中插入新节点。
•删除节点:从二叉树中删除特定值的节点。
以上操作将在下面章节详细讨论。
3. 实验步骤3.1 创建二叉树二叉树可以通过递归的方式构建。
以创建一个简单的二叉树为例:def create_binary_tree():root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)return root以上代码创建了一个二叉树,根节点的值为1,左子节点值为2,右子节点值为3,左子节点的左子节点值为4,左子节点的右子节点值为5。
3.2 遍历二叉树二叉树的遍历方式有多种,包括前序遍历、中序遍历和后序遍历。
以下是三种遍历方式的代码实现:•前序遍历:def preorder_traversal(root):if root:print(root.val)preorder_traversal(root.left)preorder_traversal(root.right)•中序遍历:def inorder_traversal(root):if root:inorder_traversal(root.left)print(root.val)inorder_traversal(root.right)•后序遍历:def postorder_traversal(root):if root:postorder_traversal(root.left)postorder_traversal(root.right)print(root.val)3.3 查找节点在二叉树中查找特定值的节点可以使用递归的方式实现。
C 语⾔数据结构之⼆叉链表创建⼆叉树⽬录⼀、思想(先序思想创建)⼆、创建⼆叉树(1)传⼀级参数⽅法(2)传⼆级参数⽅法⼀、思想(先序思想创建)第⼀步先创建根节点,然后创建根节点左⼦树,开始递归创建左⼦树,直到递归创建到的节点下不继续创建左⼦树,也就是当下递归到的节点下的左⼦树指向NULL ,结束本次左⼦树递归,返回这个节点的上⼀个节点,开始创建右⼦树,然后⼜开始以当下这个节点,继续递归创建左⼦树,左⼦树递归创建完,就递归创建右⼦树,直到递归结束返回到上⼀级指针节点(也就是根节点下),此时根节点左边⼦树创建完毕,开始创建右边⼦树,原理和根节点左边创建左右⼦树相同⼆、创建⼆叉树⼆叉树的操作通常使⽤递归⽅法,如果递归不太明⽩,建议去对此进⾏⼀下学习和练习。
⼆叉树的操作可以分为两类,⼀类是需要改变⼆叉树的结构的,⽐如⼆叉树的创建、节点删除等等,这类操作,传⼊的⼆叉树的节点参数为⼆叉树指针的地址,这种参⼊传⼊,便于更改⼆叉树结构体的指针(即地址)。
这⾥稍微有⼀点点绕,可能需要多思考⼀下如下是⼆叉数创建的函数,这⾥我规定,节点值为整数,如果输⼊的数为-1,则表⽰结束继续往下创建⼦节点的操作。
然后我们使⽤递归的⽅法以此创建左⼦树和右⼦树为了更⽅便的使⽤⼆叉树结构体,可以使⽤ typedef 对结构体进⾏命名123456typedef struct Tree{int data; // 存放数据域struct Tree *lchild; // 遍历左⼦树指针struct Tree *rchild; // 遍历右⼦树指针}Tree,*BitTree;这⾥展⽰两种传参类型的创建⽅法,其中深意可多次参考理解,加深指针理解(1)传⼀级参数⽅法123456789101112131415161718BitTree CreateLink(){ int data; int temp; BitTree T;scanf("%d",&data); // 输⼊数据temp=getchar(); // 吸收空格if(data == -1){ // 输⼊-1 代表此节点下⼦树不存数据,也就是不继续递归创建 return NULL; }else{ T = (BitTree)malloc(sizeof(Tree)); // 分配内存空间T->data = data; // 把当前输⼊的数据存⼊当前节点指针的数据域中printf("请输⼊%d 的左⼦树: ",data);T->lchild = CreateLink(); // 开始递归创建左⼦树192021222324printf("请输⼊%d 的右⼦树: ",data);T->rchild = CreateLink(); // 开始到上⼀级节点的右边递归创建左右⼦树return T; // 返回根节点 } }(2)传⼆级参数⽅法123456789101112131415161718192021222324252627282930BitTree CreateLink(BitTree *T) // 次数 T 为指向根节点的指针的地址{ int data; scanf("%d",&data); if(data == -1){*T=NULL; // 结束递归时,让指针当前节点的指针地址的 指针 指向NULL}else{*T = (BitTree)malloc(sizeof(Tree)); // 对指向节点指针地址的指针 分配内存 if(!(*T) ){ // *T = NULL 表⽰分配内存失败,也就是结束递归创建了 printf("内存分配失败\n");exit(-1);}(*T)->data = data; // 给节点指针地址内的数据域,存⼊数据 printf("请输⼊%d 的左⼦树: ",data); CreateLink(&(*T)->lchild); // 开始遍历左⼦树printf("请输⼊%d 的右⼦树: ",data);CreateLink(&(*T)->rchild); // 开始遍历右⼦树,遍历的思想⽂章开头处解释} }1234567891011121314#include<stdio.h>#include<stdlib.h> typedef struct Tree{ int data; // 存放数据域 struct Tree *lchild; // 遍历左⼦树指针 struct Tree *rchild; // 遍历右⼦树指针 }Tree,*BitTree;151617181920212223242526272829303132333435363738394041424344454647484950515253545556BitTree CreateLink(){int data; int temp; BitTree T; scanf("%d",&data); // 输⼊数据 temp=getchar(); // 吸收空格if(data == -1){ // 输⼊-1 代表此节点下⼦树不存数据,也就是不继续递归创建return NULL;}else{T = (BitTree)malloc(sizeof(Tree)); // 分配内存空间 T->data = data; // 把当前输⼊的数据存⼊当前节点指针的数据域中 printf("请输⼊%d 的左⼦树: ",data); T->lchild = CreateLink(); // 开始递归创建左⼦树printf("请输⼊%d 的右⼦树: ",data);T->rchild = CreateLink(); // 开始到上⼀级节点的右边递归创建左右⼦树 return T; // 返回根节点 } } void ShowXianXu(BitTree T) // 先序遍历⼆叉树{if(T==NULL){return; } printf("%d ",T->data);ShowXianXu(T->lchild); // 递归遍历左⼦树ShowXianXu(T->rchild); // 递归遍历右⼦树} int main(){ BitTree S;printf("请输⼊第⼀个节点的数据:\n");S = CreateLink(); // 接受创建⼆叉树完成的根节点ShowXianXu(S); // 先序遍历⼆叉树 return 0; }123456789101112131415#include<stdio.h>#include<stdlib.h>typedef struct Tree{int data;struct Tree *lchild;struct Tree *rchild;}Tree,*BitTree; BitTree CreateLink(BitTree *T) // 次数 T 为指向根节点的指针的地址{ int data;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 scanf("%d",&data);if(data == -1){*T=NULL; // 结束递归时,让指针当前节点的指针地址的指针指向NULL }else{*T = (BitTree)malloc(sizeof(Tree)); // 对指向节点指针地址的指针分配内存if(!(*T) ){ // *T = NULL 表⽰分配内存失败,也就是结束递归创建了printf("内存分配失败\n");exit(-1);}(*T)->data = data; // 给节点指针地址内的数据域,存⼊数据printf("请输⼊%d的左⼦树: ",data);CreateLink(&(*T)->lchild); // 开始遍历左⼦树printf("请输⼊%d的右⼦树: ",data);CreateLink(&(*T)->rchild); // 开始遍历右⼦树,遍历的思想⽂章开头处解释}}void ShowXianXu(BitTree T) // 先序遍历⼆叉树{if(T==NULL){return;}printf("%d ",T->data);ShowXianXu(T->lchild); // 遍历左⼦树ShowXianXu(T->rchild); // 遍历右⼦树}int main(){BitTree *S; // 创建指向这个结构体指针地址的指针printf("请输⼊第⼀个节点的数据:\n");CreateLink(&S); // 传⼆级指针地址ShowXianXu(S);return0;}到此这篇关于C语⾔数据结构之⼆叉链表创建⼆叉树的⽂章就介绍到这了,更多相关C语⾔⼆叉链表创建⼆叉树内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。