二叉树的创建及遍历

来源:互联网 发布:百度竞价账户如何优化 编辑:程序博客网 时间:2024/06/05 10:15

对任意的二叉树的结点结构都可以设置为如下结构,leftChild指向该结点的左孩子,rightChild指向右孩子,data域记录结点信息,以此结点结构形成的二叉树称为二叉链表。


存储结构类型为

typedef char Elemtype;typedef struct Node{   Elemtype data;   struct Node * LChild;   struct Node * RChild;}BiTNode,*BiTree;
以二叉树的广义表的形式创建,测试用例为"a(b(c,d(e,f)),i(j,k(x,y)))",基本思路是,将每个元素存入结点中,并根据标志变量判断是放入前结点的左孩子还是右孩子,后将‘(’后的结点压入栈中和标志置1,遇到‘)‘则出栈,’,‘则说明下个结点是父结点的右孩子,标志置0,以下为代码

BiTNode *CreateBiTNode(char *str){   char ch;int top=-1,k,j=0;   BiTNode *bt=NULL,*stack[200],*p=NULL;   ch=str[j];   while(ch!='\0'){        switch(ch){          case '(':              top++;              stack[top]=p;              k=1;              break;          case ',':              k=2;              break;          case ')':              top--;              break;          default:             p=(BiTNode *)malloc(sizeof(BiTNode));             p->data=ch;             p->LChild=p->RChild=NULL;             if(bt==NULL){                bt=p;             }else{               if(k==1){                 stack[top]->LChild=p;               }else{                 stack[top]->RChild=p;               }             }              break;        }        j++;ch=str[j];   }   return bt;}

遍历分为先中后序遍历,思想都差不多,就直接贴出前序遍历测试代码

#include<stdio.h>typedef char Elemtype;typedef struct Node{   Elemtype data;   struct Node * LChild;   struct Node * RChild;}BiTNode,*BiTree;BiTNode *CreateBiTNode(char *str){   char ch;int top=-1,k,j=0;   BiTNode *bt=NULL,*stack[200],*p=NULL;   ch=str[j];   while(ch!='\0'){        switch(ch){          case '(':              top++;              stack[top]=p;              k=1;              break;          case ',':              k=2;              break;          case ')':              top--;              break;          default:             p=(BiTNode *)malloc(sizeof(BiTNode));             p->data=ch;             p->LChild=p->RChild=NULL;             if(bt==NULL){                bt=p;             }else{               if(k==1){                 stack[top]->LChild=p;               }else{                 stack[top]->RChild=p;               }             }              break;        }        j++;ch=str[j];   }   return bt;}//前序遍历void Preorder(BiTNode *bt){   if(bt!=NULL){      printf("%c",bt->data);      Preorder(bt->LChild);      Preorder(bt->RChild);   }}int main(){  BiTNode *bt=NULL;  char *str="a(b(c,d(e,f)),i(j,k(x,y)))";  bt=CreateBiTNode(str);  Preorder(bt);}


0 0