转换二叉树与广义表(C语言版)[二叉树的定义]

转换二叉树与广义表(C语言版)[二叉树的定义]

//定义二叉树结点结构和操作的头文件btree1.h

//定义二叉树结点值的类型为字符型

 

typedef char ElemType;

//定义二叉树结点类型

 

struct BTreeNode {

       ElemType data;

    BTreeNode* left;

    BTreeNode* right;

};

//初始化二叉树,即把树根指针置空

  void InitBTree(BTreeNode*& BT);

//根据存于字符数组a的二叉树广义表建立对应的二叉树存储结构

  void CreateBTree(BTreeNode*& BT, char* a);

//判断二叉树是否为空

  bool BTreeEmpty(BTreeNode* BT);

//按任一种遍历次序输出二叉树中的所有结点

  void TraverseBTree(BTreeNode* BT, int mark);

//求二叉树的深度

  int BTreeDepth(BTreeNode* BT);

//求二叉树中所有结点数

  int BTreeCount(BTreeNode* BT);

//求二叉树中所有叶子结点数

  int BTreeLeafCount(BTreeNode* BT);

//按照二叉树的一种表示方法输出整个二叉树

  void PrintBTree(BTreeNode* BT);

//清除二叉树,使之变为一棵空树

  void ClearBTree(BTreeNode*& BT);

//二叉树操作的实现文件btree1.cpp

#include<iostream.h>

#include<stdlib.h>

#include<strstrea.h>

//初始化二叉树,即把树根指针置空

void InitBTree(BTreeNode*& BT)

{

       BT=NULL;

}

//根据存于字符数组a的二叉树广义表建立对应的二叉树存储结构

void CreateBTree(BTreeNode*& BT, char* a)

{

       BTreeNode* s[10];   //s数组作为存储二叉树中根结点指针的栈

       int top=-1;          //top作为s栈的栈顶指针

       BT=NULL;         //给树根指针置空

       BTreeNode* p;      //定义p为指向二叉树结点的指针

       int k;    //k作为处理结点的左子树和右子树的标记,k=1处理

               //左子树,k=2处理右子树

       istrstream ins(a);    //把字符串a定义为输入字符串流对象ins

       char ch; 

       ins>>ch;          //ins流对象顺序读入一个字符,

    while (ch!='@')

       {     //每循环一次处理一个读入的字符,直到扫描到'@'字符为止

              switch(ch)

              {

              case '(':

                     top++; s[top]=p; k=1; break;

        case ')':

                     top--; break;

              case ',':

                     k=2; break;

              default:

                     p=new BTreeNode;

                     p->data=ch; p->left=p->right=NULL;

                     if(BT==NULL) BT=p;

                     else {

                            if(k==1) s[top]->left=p;

                            else s[top]->right=p;

                     }

              }

        ins>>ch;

       }

}

//判断二叉树是否为空

bool BTreeEmpty(BTreeNode* BT)

{

       return BT==NULL;

}

//按任一种遍历次序输出二叉树中的所有结点

void TraverseBTree(BTreeNode* BT, int mark)

{

       if(mark==1) {  //先序遍历

              if(BT!=NULL) {

                     cout<<BT->data<<' ';

                  TraverseBTree(BT->left,mark);

                  TraverseBTree(BT->right,mark);

              }

       }

    else if(mark==2) {  //中序遍历

           if(BT!=NULL) {

                  TraverseBTree(BT->left,mark);

                  cout<<BT->data<<' ';

                  TraverseBTree(BT->right,mark);

              }

       }

       else if(mark==3) {  //后续遍历

              if(BT!=NULL) {

                  TraverseBTree(BT->left,mark);

                  TraverseBTree(BT->right,mark);

                  cout<<BT->data<<' ';

              }

       }

       else if(mark==4)  //按层遍历

       {

           const MaxLength=30;

           BTreeNode* Q[MaxLength];

               //定义存储二叉树结点指针的数组空间作为队列使用

           int front=0, rear=0;

               //定义队首指针和队尾指针,初始均置0表示空队

        BTreeNode* p;

           if(BT!=NULL) {

                  rear=(rear+1)%MaxLength;  //后移队尾指针

               Q[rear]=BT;  //将树根结点指针进队

              }

           while (front!=rear)

              { //当队列非空时执行循环

                  front=(front+1)%MaxLength; 

                       //后移队首指针

                  p=Q[front]; 

                          //删除队首结点

                  cout<<p->data<<' '; 

                          //输出队首结点的值

            if(p->left!=NULL)

                     { //若结点存在左孩子,则左孩子结点指针进队

                   rear=(rear+1)%MaxLength;

                   Q[rear]=p->left;

                     }

            if(p->right!=NULL)

                     { //若结点存在右孩子,则右孩子结点指针进队

                   rear=(rear+1)%MaxLength;

                   Q[rear]=p->right;

                     }

              }

       }

       else {

              cerr<<"mark的值无效! 遍历失败!"<<endl;

           exit(1);

       }

}

广义表转二叉树

#include <stdio.h>

#include <stdlib.h>

typedef struct BiTree

{

        char data;

        struct BiTree *lchild;

        struct BiTree *rchild;

}BitreeNode;

void  CreateBiTree(BitreeNode ** BT)

{

        char *s= new char[20];

        char ch;

        int top = -1,i=0,key;

        BitreeNode *node[10],*p=0;

        *BT = NULL;

        printf("请输入树的广义表表达式,例如“A(B(D,E),C)@:/n");

        scanf("%s",s);

        ch = s[i++];

        while(ch !='@')

        {

                switch(ch)

                {

                case '(':node[++top] = p;key = 1;break;

                case ')':top--;break;

                case ',':key = 2;break;

                default: p = new BitreeNode;

                             p->data = ch;

                                 p->lchild = p->rchild = NULL;

                                 if(*BT == NULL)

                                         *BT = p;

                                 else

                                 {

                                         switch(key)

                                         {

                                         case 1:

                                                 node[top]->lchild = p;

                                                 break;

                                         case 2:

                                                 node[top]->rchild = p;

                                                 break;

                                         }

                                 }

                }

                ch = s[i++];

        }

}

void main()

{

        BitreeNode *Node;

       CreateBiTree(&Node);

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树广义表表示法是一种用字符串来表示二叉树的方法,在广义表中,每个节点都可以是一个数据元素,也可以是一个子树的广义表广义表表示法可以用来表示二叉树,也可以用来表示一般的树。 二叉树广义表表示法是一种递归定义,它可以用以下的方式来表示一个二叉树: 1. 如果该二叉树为空,那么它的广义表表示为()。 2. 如果该二叉树不为空,那么它的广义表表示为“(数据元素,左子树广义表,右子树广义表)”。 例如,对于以下的二叉树: ``` A / \ B C / / \ D E F ``` 它的广义表表示为:(A,B(D,(),()),C(E,(),F)) 下面是C语言实现二叉树广义表形式的链表结构的代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 二叉树结点 typedef struct node { char data; // 数据域 struct node *left; // 左子树指针 struct node *right; // 右子树指针 } Node; // 创建新结点 Node *new_node(char data) { Node *node = (Node *)malloc(sizeof(Node)); node->data = data; node->left = NULL; node->right = NULL; return node; } // 构建二叉树 Node *build_tree(char *str, int *index) { Node *root = NULL; if (str[*index] != '(') { // 如果当前字符不是'(',则返回空指针 return NULL; } *index += 1; // index指向下一个字符 if (str[*index] != ')') { // 如果当前字符不是')',则创建新结点 root = new_node(str[*index]); *index += 1; // index指向下一个字符 root->left = build_tree(str, index); // 递归构建左子树 root->right = build_tree(str, index); // 递归构建右子树 } *index += 1; // index指向下一个字符 return root; } // 中序遍历二叉树 void inorder(Node *root) { if (root == NULL) { return; } inorder(root->left); printf("%c ", root->data); inorder(root->right); } int main() { char *str = "(A,B(D,(),()),C(E,(),F))"; int index = 0; Node *root = build_tree(str, &index); inorder(root); return 0; } ``` 该程序将输出:D B A E C F

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值