赞
踩
数据结构与算法 二叉树链式存储与括号表示法的相互转换
一、简述
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(")") ;有孩子必定有右括号
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。