二叉树链式存储与括号表示法的相互转换
一、简述
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(")") ;////有孩子必定有右括号 } } }