数据结构实验十一 线索二叉树的中序遍历

简介: 数据结构实验十一 线索二叉树的中序遍历

一、实验目的

1.理解线索二叉树的存储结构;

2.熟练掌握线索二叉树的生成、遍历等常见操作

二、实验内容及步骤

(一)实验内容

1. 练习线索二叉树的建立与存储

2. 练习线索二叉树的遍历

(二)实验步骤

建立线索二叉树,并通过调用函数,输出中序遍历的结果。

1. #include<iostream>
2. using namespace std;
3. 
4. //二叉树的二叉线索类型存储表示
5. typedef struct BiThrNode
6. {        
7.  char data;
8.  struct BiThrNode *lchild,*rchild;
9.  int LTag,RTag;  
10.   }BiThrNode,*BiThrTree;
11. 
12. //全局变量pre
13. BiThrNode *pre=new BiThrNode;
14. 
15. //用算法5.3建立二叉链表
16. void CreateBiTree(BiThrTree &T)
17. { 
18.   //按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
19.   char ch;
20.   cin >> ch;
21.   if(ch=='#')  T=NULL;      //递归结束,建空树
22.   else
23.   {             
24.     T=new BiThrNode;
25.     T->data=ch;         //生成根结点
26.     CreateBiTree(T->lchild);  //递归创建左子树
27.     CreateBiTree(T->rchild);  //递归创建右子树
28.   }               //else
29. }                 //CreateBiTree
30. 
31. //用算法5.7以结点P为根的子树中序线索化
32. void InThreading(BiThrTree p)
33. {
34.   //pre是全局变量,初始化时其右孩子指针为空,便于在树的最左点开始建线索
35.   if(p)
36.   {
37.     InThreading(p->lchild);                   //左子树递归线索化
38.     if(!p->lchild)
39.     {                                 //p的左孩子为空
40.       p->LTag=1;                                  //给p加上左线索
41.       p->lchild=pre;                //p的左孩子指针指向pre(前驱)
42.     } 
43.     else
44.       p->LTag=0;
45.     if(!pre->rchild)
46.     {                       //pre的右孩子为空
47.       pre->RTag=1;                          //给pre加上右线索
48.       pre->rchild=p;                          //pre的右孩子指针指向p(后继)
49.     }
50.     else
51.       pre->RTag=0;
52.     pre=p;                                //保持pre指向p的前驱
53.     InThreading(p->rchild);                     //右子树递归线索化
54.     }
55. }//InThreading
56. 
57. //用算法5.8带头结点的中序线索化
58. void InOrderThreading (BiThrTree &Thrt,BiThrTree T)
59. {
60.   //中序遍历二叉树T,并将其中序线索化,Thrt指向头结点
61.   Thrt=new BiThrNode;             //建头结点
62.   Thrt->LTag=0;                     //头结点有左孩子,若树非空,则其左孩子为树根
63.   Thrt->RTag=1;                   //头结点的右孩子指针为右线索
64.   Thrt->rchild=Thrt;                //初始化时右指针指向自己
65.   if(!T)  Thrt->lchild=Thrt;        //若树为空,则左指针也指向自己
66.   else
67.   {
68.     Thrt->lchild=T;  pre=Thrt;    //头结点的左孩子指向根,pre初值指向头结点
69.     InThreading(T);                 //调用算法5.7,对以T为根的二叉树进行中序线索化
70.     pre->rchild=Thrt;               //算法5.7结束后,pre为最右结点,pre的右线索指向头结点
71.     pre->RTag=1;                 
72.     Thrt->rchild=pre;               //头结点的右线索指向pre
73.   }
74. }                     //InOrderThreading
75. 
76. void InOrderTraverse_Thr(BiThrTree T)
77. { BiThrNode *p;
78. //T指向头结点,头结点的左链lchild指向根结点,可参见线索化算法5.8。
79. //中序遍历二叉线索树T的非递归算法,对每个数据元素直接输出
80.   p=T->lchild;
81.   while(p!=T)
82. {
83.   while(p->LTag==0) p=p->lchild;
84.   cout<<p->data;
85.   while(p->RTag==1&&p->rchild!=T)
86.   {
87.     p=p->rchild;cout<<p->data;  
88.   }
89.   p=p->rchild; 
90. }}                          
91. int main()
92. {
93.   pre->RTag=1;
94.   pre->rchild=NULL;
95.   BiThrTree tree,Thrt;
96.   cout<<"请输入建立二叉链表的序列:\n";
97.   CreateBiTree(tree);
98.   InOrderThreading(Thrt,tree);
99.   cout<<"中序遍历线索二叉树的结果为:\n";
100.  InOrderTraverse_Thr(Thrt);
101.  cout<<endl;
102.  return 0;
103. }
目录
相关文章
|
3月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
94 9
 算法系列之数据结构-二叉树
|
5月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
145 12
|
5月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
137 10
|
5月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
195 2
|
5月前
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
244 0
|
7月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
717 9
|
16天前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
栈区的非法访问导致的死循环(x64)
|
7月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
174 58
|
15天前
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
5月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
292 77