二叉树的创建及遍历

本文探讨了二叉树的结点结构,包括左孩子和右孩子的定义,以及如何利用data域存储信息。通过这样的二叉链表结构,可以实现二叉树的各种遍历操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对任意的二叉树的结点结构都可以设置为如下结构,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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值