利用后缀表达式构建一颗表达式树——C语言实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);	
	}
}


猜你喜欢

转载自blog.csdn.net/FelikZhang/article/details/78940134