《数据结构与算法分析——c语言描述》读后笔记 8
2015-08-18 10:05
483 查看
二叉树
表达式树的树叶是操作数(operand),比如常数或变量,而其他的节点为操作符(operator)。这里限定操作符只能为+,-,*,/四个操作符。
把后缀表达式转变成表达式树:
程序:
//expression_tree.h
//expression_tree.c
//stack.h
//stack.c
//MainProgram.c
表达式树的树叶是操作数(operand),比如常数或变量,而其他的节点为操作符(operator)。这里限定操作符只能为+,-,*,/四个操作符。
把后缀表达式转变成表达式树:
程序:
//expression_tree.h
struct TreeNode; typedef struct TreeNode *PtrToNode; typedef PtrToNode Tree; typedef char Type; PtrToNode CreateNode(char ch); struct TreeNode { Type Element; Tree Left; Tree Right; };
//expression_tree.c
#include "expression_tree.h" #include<stdlib.h> #include<stdio.h> PtrToNode CreateNode(char ch) { PtrToNode p=malloc(sizeof(struct TreeNode)); if(p==NULL) { printf("The node is NULL !\n"); return p; } p->Element=ch; return p; }
//stack.h
#include "expression_tree.h" typedef Tree ElementType; #ifndef _Stack_h struct Node; typedef struct Node *Stack; int IsEmpty(Stack S); int IsFull(Stack S); Stack CreateStack( int MaxElements ); void DisposeStack(Stack S); void MakeEmpty(Stack S); void Push( ElementType X, Stack S); ElementType Top( Stack S); void Pop(Stack S); ElementType TopAndPop( Stack S ); #define EmptyTOS (-1) #define MinStackSize (5) struct Node { int Capacity; int TopOfStack; ElementType *Array; }; #endif
//stack.c
#include "stack.h" #include<stdio.h> #include<error.h> #include<stdlib.h> int IsEmpty(Stack S) { return S->TopOfStack==EmptyTOS; } int IsFull(Stack S) { return S->TopOfStack==(S->Capacity-1); } Stack CreateStack( int MaxElements ) { Stack S; if(MaxElements<MinStackSize) error(1,1,"Stack size is too small"); S=malloc(sizeof(struct Node)); if(S==NULL) error(1,1,"Out of space!!!"); S->Array=malloc(sizeof(ElementType)*MaxElements); if(S->Array==NULL) error(1,1,"Out of space!!!"); S->Capacity=MaxElements; MakeEmpty(S); return S; } void DisposeStack(Stack S) { if(S!=NULL) { free(S->Array); free(S); } } void MakeEmpty(Stack S) { S->TopOfStack=EmptyTOS; } void Push(ElementType X,Stack S) { if(IsFull(S)) error(1,1,"Full stack"); else { S->TopOfStack++; S->Array[S->TopOfStack]=X; } } ElementType Top( Stack S) { if(!IsEmpty(S)) return S->Array[S->TopOfStack]; error(1,1,"Empty stack 3"); return 0; } void Pop( Stack S) { if(IsEmpty(S)) error(1,1,"Empty stack 2"); else S->TopOfStack--; } ElementType TopAndPop( Stack S) { if(!IsEmpty(S)) { return S->Array[ S->TopOfStack--]; } error(1,1,"Empty stack 1"); return 0; }
//MainProgram.c
#include<stdio.h> #include<stdlib.h> #include<string.h> #include"stack.h" Tree CreateTree(char* str) { Tree T,p,q; int len=strlen(str); Stack S=CreateStack(len); int i; for(i=0;i<len;++i) { switch(str[i]) { case '+': case '-': case '*': case '/': { T=CreateNode(str[i]); p=TopAndPop(S); q=TopAndPop(S); T->Left=q; T->Right=p; Push(T,S); break; } default: { T=CreateNode(str[i]); Push(T,S); break; } } } return Top(S); } void outtree(Tree t) { if(t!=NULL) { outtree(t->Left); outtree(t->Right); printf("%c",t->Element); } } int main() { char* ss="ab+cde+**"; Tree TT=CreateTree(ss); outtree(TT); printf("\n"); return 0; }利用后缀表达式构造一个表达式树,然后以后序遍历策略输出该树:
相关文章推荐
- 数据结构特性
- 转载 PHP 程序员学数据结构与算法之《栈》
- 【五】nginx的数据结构(3)——扩展红黑树
- POJ 1442(treap || 优先队列)
- python中的数据结构 之 list列表
- R语言_数据结构
- 数据结构--赫夫曼树(最优二叉村)
- 数据结构:可合并堆——左偏树
- 算法竞赛入门经典:第六章 数据结构基础 6.14欧拉回路
- 算法竞赛入门经典:第六章 数据结构基础 6.13拓扑排序
- 算法竞赛入门经典:第六章 数据结构基础 6.12迷宫路径
- 算法竞赛入门经典:第六章 数据结构基础 6.11迷宫
- 算法竞赛入门经典:第六章 数据结构基础 6.10黑白图像
- 算法竞赛入门经典:第六章 数据结构基础 6.9 根据二叉树的后序和中序确定前序序列
- 算法竞赛入门经典:第六章 数据结构基础 6.7层次遍历
- 算法竞赛入门经典:第六章 数据结构基础 6.6层次遍历
- 算法竞赛入门经典:第六章 数据结构基础 6.5小球下落
- 算法竞赛入门经典:第六章 数据结构基础 6.4测试
- 算法竞赛入门经典:第六章 数据结构基础 6.3移动小球
- 算法竞赛入门经典:第六章 数据结构基础 6.2铁轨