首页 > 代码库 > 由数字式子生成对应的二叉树

由数字式子生成对应的二叉树

/*由式子生成二叉树*/
//例如输入:1-2*3+4/(5+6)-7*8#
#include<stdio.h>
#include<malloc.h>
//////////////////////////////////////////////////////////////////////////////////////////////////
//定义数据结构
#define MaxSize 50
typedef struct{
	int b;//指示是数字还是运算符,如果是数字为0,如果是运算符,也用来区分是同类中是第几个运算
	int pri;
	int data;
}Array;
typedef struct BitNode{
	//ElemType data;
	Array data;
	struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
//////////////////////////////////////////////////////////////////////////////////////////////////
void Print(Array A[],int length){
	int i=0;
	while(i<length){
		if(A[i].b)
			printf("%c",A[i].data);
		else printf("%d",A[i].data);
		i++;
	}
	printf("\n");
}
int ToInOrder(Array A[],Array B[],int length){
	//将式子转化为中序,即效果上是去除括号
	int i=0,k=0;
	for(i=0;i<length;i++)
		if(A[i].data!='(' && A[i].data!=')')
			B[k++]=A[i];
	return k;
}
int ToPostOrder(Array A[],Array C[],int length){
	int i=0,k=0;
	Array D[MaxSize];//栈
	int top=-1,temp;
	for(i=0;i<length;i++){
		if(A[i].b!=0){//判断是否是运算符
			temp=A[i].pri;
			if(top!=-1){
				while(top!=-1 && D[top].pri>temp)
					C[k++]=D[top--];//出栈
				if(top!=-1 && D[top].pri==temp){
					top--;//出栈‘(’并且舍弃‘)’
					continue;
				}
			}
			D[++top]=A[i];//入栈
			switch(A[i].data){//修改栈内优先级
			case '+':D[top].pri=3;break;
			case '-':D[top].pri=3;break;
			case '*':D[top].pri=5;break;
			case '/':D[top].pri=5;break;
			case '(':D[top].pri=1;break;
			case ')':D[top].pri=6;break;
			}
		}
		else
			C[k++]=A[i];//如果是数字,直接输出
	}
	while(top!=-1)//出栈
		C[k++]=D[top--];
	return k;
}
BiTree PostInCreateTree(Array A[],Array B[],int l1,int h1,int l2,int h2){//由中序和后序来构造树,l1,h1为最小下标和最大下标
	int i=0,llen=0,rlen=0;
	BiTree T=(BiTree)malloc(sizeof(BitNode));
	T->data=http://www.mamicode.com/A[h1];//A为后序>

由数字式子生成对应的二叉树