版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FelikZhang/article/details/78940134
表达式树是指所有叶子结点为操作数,根节点和中间节点为操作符的树。如果操作符是二元运算符,那么构建出来的二叉树为为一颗二叉树。
构建一颗表达式的算法如下:
从第一个符号开始,一次读取一个后缀表达式中的符号。如果符号是操作数,那么建立一个单节点树,并将一个指向它的指针入栈(注意这里栈中存的是指针)。如果符号是操作符那么 就从栈弹出两颗树的指针,以当前读到的操作符为根节点构建一颗树。最后再将该树的根节点入栈。循环此过程,知道读完并处理完所有符号(后缀表达式中的符号)。
C语言实现的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node{
int data;
struct Node *right;
struct Node *left;
}BTNode;
BTNode* CreatExpressionTree(char data[],int num);
void PostOrder_LDR(BTNode *root);
void PostOrder_DLR(BTNode *root);
void PostOrder_LRD(BTNode *root);
int main(void)
{
BTNode *root=NULL;
char data[]={"ab/cd*+ef/+g+"};//任意的后缀表达式
int num;
num=strlen(data);
root=CreatExpressionTree(data,num);
//构造出表达式树后以不同的形式输出,观察结果
printf("后序遍历结果为:");
PostOrder_LRD(root);
printf("\n中序遍历结果为:");
PostOrder_LDR(root);
printf("\n先序遍历结果为:");
PostOrder_DLR(root);
return 0;
}
//构造表达式树的函数 核心代码
BTNode* CreatExpressionTree(char data[],int num)
{
BTNode *p=NULL;
int i=0;
BTNode* Stack[5];
int top=-1;
for(i=0;i<num;i++){
p=(BTNode *)malloc(sizeof(BTNode));
p->right=p->left=NULL;
p->data=data[i];
if(p->data<=122 && p->data>=97){//p->data为小写字母
Stack[++top]=p;
}
else{
p->right=Stack[top--];
p->left=Stack[top--];
Stack[++top]=p;
}
}
return Stack[0];
}
void PostOrder_LDR(BTNode *root) //中序遍历
{
if(root){
PostOrder_LDR(root->left);
printf("%c ",root->data);
PostOrder_LDR(root->right);
}
}
void PostOrder_DLR(BTNode *root) //先序遍历
{
if(root){
printf("%c ",root->data);
PostOrder_DLR(root->left);
PostOrder_DLR(root->right);
}
}
void PostOrder_LRD(BTNode *root) //后序遍历
{
if(root){
PostOrder_LRD(root->left);
PostOrder_LRD(root->right);
printf("%c ",root->data);
}
}