下面这个程序是我看weiss的《数据结构与算法分析》的第四章的树里面的一个算法写的程序,具体可以看该书的第一版的71页这个给出我的实现,希望来者给出更加好的设计思路。
程序里面给出了8种遍历方式,欧拉遍历(其实就是中序加了两个括号而已),前序非递归,中序非递归,后序非递归,前序递归,中序递归,后序递归,
另外程序也添加了按层遍历二叉树,程序如下:
-
#include<ctype.h>
-
#include<malloc.h>
-
#include<stdio.h>
-
#include<queue>
-
usingnamespacestd;
-
typedefstructTreenode*ptrtonode;
- typedefptrtonodeTree;
-
structTreenode{
-
charx;
- Treelefttree;
- Treerighttree;
- }Treenode;
-
typedefstructList_Stack{
-
structList_Stack*next;
- Treemytree;
- }Node,*LS;
-
voidinitstack(LS*a){
-
(*a)=(LS)malloc(sizeof(Node));
- (*a)->next=NULL;
- }
-
boolstackempty(constLSa){
-
returna->next==NULL;
- }
-
-
-
voidpush(LS*lstack,Treea){
-
LSres=(LS)malloc(sizeof(Node));
- res->mytree=a;
- res->next=(*lstack)->next;
- (*lstack)->next=res;
- }
- Treepop(LS*lstack){
-
if(stackempty(*lstack)){
-
printf("Poperror,stackisempty!\n");
-
returnNULL;
- }
- LSp=(*lstack)->next;
- Treex=p->mytree;
- LSpnext=p->next;
-
- (*lstack)->next=pnext;
-
returnx;
- }
-
boolisoperator(chara){
-
if(a=='-'||a=='+'||a=='*'||a=='/')
-
return1;
-
else
-
return0;
- }
-
Treechartotree(chara){
-
Treemytree=(Tree)malloc(sizeof(Treenode));
- mytree->x=a;
- mytree->lefttree=mytree->righttree=NULL;
-
returnmytree;
- }
-
boolexnode(Treex){
-
if((x->righttree==NULL)&&(x->lefttree==NULL)){
-
return1;
- }
-
else
-
return0;
- }
-
boolinnode(Treex){
-
return!exnode(x);
- }
-
-
voideulervisit(Treex){
-
if(exnode(x)){
-
printf("%c",x->x);
- }
-
else{
-
printf("(");
- eulervisit(x->lefttree);
-
printf("%c",x->x);
- eulervisit(x->righttree);
-
printf(")");
- }
- }
-
-
boolmidvisit(Treex){
-
if(x){
-
if(midvisit(x->lefttree))
-
if(printf("%c",x->x))
-
if(midvisit(x->righttree))
-
return1;
-
return0;
- }
-
else
-
return1;
- }
-
-
boolprevisit(Treex){
-
if(x){
-
if(printf("%c",x->x))
-
if(previsit(x->lefttree))
-
if(previsit(x->righttree))
-
return1;
-
return0;
- }
-
else
-
return1;
- }
-
-
voidpostvisit(Treex){
-
if(x){
- postvisit(x->lefttree);
- postvisit(x->righttree);
-
printf("%c",x->x);
- }
- }
-
-
voidpreordervisit(Treex){
- LSa;
- initstack(&a);
- Treep=x;
-
while(p||!stackempty(a))
- {
-
if(p)
- {
- push(&a,p);
-
printf("%c",p->x);
- p=p->lefttree;
- }
-
else{
- p=pop(&a);
- p=p->righttree;
- }
- }
- }
-
-
voidinordervisit(Treex){
- LSa;
- initstack(&a);
- Treep=x;
-
while(p||!stackempty(a))
- {
-
if(p)
- {
- push(&a,p);
- p=p->lefttree;
- }
-
else{
- p=pop(&a);
-
printf("%c",p->x);
- p=p->righttree;
- }
- }
- }
-
-
-
-
voidpostordervisit(Treex){
- Treestack[100],p;
-
inttag[100],top;
- top=0;
- p=x;
-
do
- {
-
while(p!=NULL)
- {
- top++;
- stack[top]=p;
-
tag[top]=0;
- p=p->lefttree;
- }
-
if(top>0)
- {
-
if(tag[top]==1)
- {
-
printf("%c",stack[top]->x);
- top--;
- }
-
else{
- p=stack[top];
-
if(top>0)
- {
- p=p->righttree;
- tag[top]=1;
- }
- }
- }
-
}while((p!=NULL)||(top!=0));
- }
-
Treecreatetree(char*a){
- LSx;
- initstack(&x);
-
char*p=a;
-
while(*p!='\0'){
- Treea,b;
- Treemytree;
-
if(isalpha(*p)){
- mytree=chartotree(*p);
- push(&x,mytree);
- }
-
if(isoperator(*p)){
- mytree=chartotree(*p);
- a=pop(&x);
- b=pop(&x);
- mytree->righttree=a;
- mytree->lefttree=b;
- push(&x,mytree);
- }
- p++;
- }
- Treeroot=pop(&x);
-
returnroot;
- }
-
voiddeletenode(Tree*p){
- queue<Tree>que;
- que.push(*p);
- Treetemp;
-
while(!que.empty()){
- temp=que.front();
- que.pop();
-
if(temp->lefttree)
- que.push(temp->lefttree);
-
if(temp->righttree)
- que.push(temp->righttree);
-
-
printf("%c",temp->x);
- temp=NULL;
- }
- }
-
intmain(intargc,char*argv[])
- {
- LSx;
- initstack(&x);
-
if(stackempty(x))
-
printf("stackisempty!\n");
-
else
-
printf("stackisfull!\n");
-
printf("%c\n",pop(&x));
-
char*p="abc*+b-";
- Treeroot=createtree(p);
-
-
- eulervisit(root);
-
puts("\n中序递归");
- midvisit(root);
-
puts("\n中序非递归");
- inordervisit(root);
-
puts("\n前序递归");
- previsit(root);
-
puts("\n前序非递归");
- preordervisit(root);
-
puts("\n后序递归");
- postvisit(root);
-
puts("\n后序非递归");
- postordervisit(root);
- deletenode(&root);
-
return0;
- }
分享到:
相关推荐
例如,如果我们有数组 `[1, 2, 3, 4, 5]`,我们可能想要构造一个完全二叉树,使得数组中的每个元素成为二叉树的一个节点,而数组的索引决定节点的位置。在这种情况下,数组的索引0是根节点,索引1和2是其左子节点和...
(1) ReadExpre(E)- _以字符序列的形式输入语法正确的前缀表达式并构造表达式E。(2) WriteExpre(E)- 用带括弧的中缀表达式输出表达式E。 (3) Assign(V,c)-实现对变量 V的赋值(V=c), 变量的初值为0。 (4) Value(E)-对...
1. 构建:从后缀表示或前缀表示构造二叉树,可以使用栈来辅助实现。 2. 遍历:主要有前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根),每种遍历方式对应不同的算术表达式表示。 3. 计算:通过...
1. 创建一个空节点(默认构造函数)。 2. 创建一个只包含元素的节点。 3. 创建一个包含元素和左右子节点的节点。 #### 三、二叉树类的定义 接下来是`BinaryTree`类的定义,它使用了模板来支持不同类型的元素。`...
表达式二叉树是一种特殊的二叉树,用于表示数学表达式,其中叶子节点代表操作数,非叶子节点代表运算符。二叉树的遍历方法有三种主要类型:前序遍历、中序遍历和后序遍历。此外,还有层序遍历(广度优先搜索)和两种...
在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。后序遍历的特点是:左子树 -> 右子树 -> 根节点,这种遍历方式对于解决特定问题非常有用,如表达式树的构建。 在这个话题...
非递归方法则可能利用栈来模拟运算过程,从左到右遍历表达式,逐步构造二叉树。 在提供的压缩包文件 "建树" 中,可能包含了实现这一功能的代码示例,或者是用于测试该功能的数据集。通过分析和理解这些内容,我们...
【Java实现表达式二叉树】是编程领域中一种数据结构的应用,主要用于处理数学表达式。在计算机科学中,二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常分为左子节点和右子节点。表达式二叉树,又...
1、设计一个程序,根据二叉树的先根序列和中根序列创建一棵用左右指针表示的二叉树 例如:先根序列为 ABDGCEF#, 中根序列为 DGBAECF# (#表示结束)。然后用程序构造一棵二叉树。注意程序的通用性(也就是说上述只是...
2. **二叉树的构造函数**:根据算术表达式构建二叉树。 3. **遍历方法**:实现前序、中序、后序遍历。 4. **计算方法**:遍历二叉树并执行相应的操作,如加、减、乘、除等。 5. **打印方法**:以中缀、前缀或后缀...
表达式二叉树是一种特殊类型的树,其非叶节点表示运算符,叶节点表示操作数。生成表达式二叉树的过程是将算术表达式从左到右扫描,遇到运算符时创建新节点,遇到操作数时连接到新节点。这个过程可以用来帮助理解...
给定前序和中序遍历的结果,可以唯一确定一棵二叉树。前序遍历的第一个元素是树的根节点,而在中序遍历中,这个根节点将树分为了左子树和右子树两部分。根据这两个遍历结果,可以递归地构造整个二叉树。 4. **Java...
在本课程设计中,主要涉及了两个核心主题...通过以上步骤,可以完成课程设计的要求,实现二叉树的构造与操作,以及算术表达式的中缀到后缀转换和求值。这些技能对于理解和应用数据结构,特别是C语言编程来说至关重要。
1. ReadExpr(E)——以字符序列的形式输入语法正确的前缀表示式并构造表达式E。 2. WriteExpr(E)——用带括号的中缀表示式输出表达式E。 3. Assign(V,c)——实现对变量V的赋值(V=c),变量的初值为0。 4. Value...
在表达式求值的场景下,我们可以构建一种特殊的二叉树——操作符优先二叉树(也称为后缀表达式或逆波兰表示法)或者中缀表达式二叉树。这里我们讨论中缀表达式二叉树,它能直观地反映出表达式的结构。 在构建中缀...
在这个项目中,我们关注的是五种重要的数据结构及其应用:单链表、表达式求值、二叉树、二叉排序树和Huffman编码。这些概念在算法设计、编译器构建、文件压缩等领域都有广泛应用。 首先,单链表是一种线性数据结构...
在这个特定的课程设计中,“二叉树表示的算术表达式”是关键主题,它将二叉树这一数据结构应用于解析和操作数学表达式。下面我们将详细探讨这个主题涉及的知识点。 首先,我们要理解什么是二叉树。二叉树是一种特殊...