二叉树链式存储与括号表示法的相互转换

二叉树链式存储与括号表示法的相互转换

一、简述

    1、根据括号表示法创建链式二叉树

    2、根据链式二叉树输出对应的括号表示法

二、效果

    

三、源代码

#include <stdio.h>
#include <stdlib.h>//malloc()函数所在库 

typedef struct NODE  //树节点 
{
	char data;//节点 
	struct NODE* lchild;//指向左孩子 
	struct NODE* rchild;//指向右孩子 
}BTNode;

//函数声明 
BTNode* CreateBTree(char *str);//根据括号式创建链式二叉树 
void PrintBTree(BTNode* root);//根据根节点,输出二叉树的括号表达式 

int main(int argc,char* argv)
{
	BTNode* root;
	root = CreateBTree("A(B(D(,G)),C(E,F))");
	PrintBTree(root) ;
	getchar();
}

BTNode* CreateBTree(char *str)//根据括号式创建链式二叉树 
{
	BTNode* root = NULL;//初始化树,tree根节点 
	BTNode* st[100] = {0} ,*p;//栈st存放要操作的节点,p指向新节点
	int top = -1;//栈顶指示 
	int k = 0;//左右孩子标志 
	int j = 0;// str索引
	
	char ch =  str[j];//取str第一个字符
	while(ch!='\0')//当ch不为 '\n'时,进行操作 
	{
		switch(ch)
		{
			case '(':st[++top] = p;//遇到字符'(',将新节点进栈,合法的字符串里面,'('前面肯定会有节点字符 
					 k = 1;//标志下一个节点处理为当前节点的左孩子 
					 break; 
			case ')':--top;//遇到字符')'表示当前节点处理完毕,将其出栈 
					 break;
			case ',':k = 2;//标志下一个节点处理为当前节点的右孩子
					 break;
			default: p = (BTNode*)malloc(sizeof(BTNode));//节点字符,申请新节点 
	 				 p->data = ch;//将数据域设置为当前字符 
	 				 p->lchild = NULL;//指针置空 
	 				 p->rchild= NULL;//指针置空 
	 				 
	 				 if(root == NULL)//如果跟节点为空,将新节点作为根节点 
	  				 {
	  				 	 root = p;
				     } 
				     else
					 {
					 	switch(k)//根据k值将新节点设置为当前操作节点的左孩子或右孩子 
					 	{
					 		case 1:st[top]->lchild = p;break;
					    	case 2:st[top]->rchild = p;break;
						}
					 } 
					 break;
		}	
		ch = str[++j] ;//继续处理下一字符 
	} 
	return root;
}

void PrintBTree(BTNode* root)//根据根节点,输出二叉树的括号表达式 
{
	if(root!=NULL)
	{
		printf("%c",root->data);//打印当前节点 
		if(root->lchild!=NULL || root->rchild!=NULL)//如果当前节点有孩子 
		{
			printf("(") ;//有孩子必定有左括号
			if(root->lchild!=NULL) //如果左孩子不为空,打印左孩子 
			{
				PrintBTree(root->lchild);
			}
			if(root->rchild!=NULL)//如果右孩子不为空,打印右孩子 
			{
				printf(",");//有右孩子必定有',' 
				PrintBTree(root->rchild);
			} 
			printf(")") ;////有孩子必定有右括号
		}
	}
} 

猜你喜欢

转载自blog.csdn.net/nanfeibuyi/article/details/80164267