第十一周项目2-用二叉树构造算法的验证

来源:互联网 发布:c语言人事管理系统 编辑:程序博客网 时间:2024/05/18 00:59

问题及代码:

/*    * Copyright (c)2016,烟台大学计算机与控制工程学院    * All rights reserved.    * 文件名称:222.cpp    * 作    者:张相如    * 完成日期:2016年11月10日    * 版 本 号:v1.0     *问题描述:用二叉树来表示代数表达式,树的每一个分支节点代表一个运算符,           每一个叶子节点代表一个运算数(为简化,只支持二目运算的+、-、*、/,           不加括号,运算数也只是一位的数字字符。本项目只考虑输入合乎以上规则的情况)。           请设计算法,(1)根据形如“1+2∗3−4/5”的字符串代表的表达式,构造出对应的二叉树(如图),           用后序遍历的思路计算表达式的值时,能体现出先乘除后加减的规则;(2)对构造出的二叉树,           计算出表达式的值。  *输入描述:无    *程序输出:测试数据    */
btree.h:

#define MaxSize 100      typedef char ElemType;      typedef struct node      {          ElemType data;              //数据元素          struct node *lchild;        //指向左孩子          struct node *rchild;        //指向右孩子      } BTNode;      void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链      BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针      BTNode *LchildNode(BTNode *p);  //返回*p节点的左孩子节点指针      BTNode *RchildNode(BTNode *p);  //返回*p节点的右孩子节点指针      int BTNodeDepth(BTNode *b); //求二叉树b的深度      void DispBTNode(BTNode *b); //以括号表示法输出二叉树      void DestroyBTNode(BTNode *&b);  //销毁二叉树      void LevelOrder(BTNode *b);  
btree.cpp:

#include <stdio.h>      #include <malloc.h>      #include "btree.h"      void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链      {          BTNode *St[MaxSize],*p=NULL;          int top=-1,k,j=0;          char ch;          b=NULL;             //建立的二叉树初始时为空          ch=str[j];          while (ch!='\0')    //str未扫描完时循环          {              switch(ch)              {              case '(':                  top++;                  St[top]=p;                  k=1;                  break;      //为左节点              case ')':                  top--;                  break;              case ',':                  k=2;                  break;                          //为右节点              default:                  p=(BTNode *)malloc(sizeof(BTNode));                  p->data=ch;                  p->lchild=p->rchild=NULL;                  if (b==NULL)                    //p指向二叉树的根节点                      b=p;                  else                            //已建立二叉树根节点                  {                      switch(k)                      {                      case 1:                          St[top]->lchild=p;                          break;                      case 2:                          St[top]->rchild=p;                          break;                      }                  }              }              j++;              ch=str[j];          }      }      BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针      {          BTNode *p;          if (b==NULL)              return NULL;          else if (b->data==x)              return b;          else          {              p=FindNode(b->lchild,x);              if (p!=NULL)                  return p;              else                  return FindNode(b->rchild,x);          }      }      BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针      {          return p->lchild;      }      BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针      {          return p->rchild;      }      int BTNodeDepth(BTNode *b)  //求二叉树b的深度      {          int lchilddep,rchilddep;          if (b==NULL)              return(0);                          //空树的高度为0          else          {              lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep              rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep              return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);          }      }      void DispBTNode(BTNode *b)  //以括号表示法输出二叉树      {          if (b!=NULL)          {              printf("%c",b->data);              if (b->lchild!=NULL || b->rchild!=NULL)              {                  printf("(");                  DispBTNode(b->lchild);                  if (b->rchild!=NULL) printf(",");                  DispBTNode(b->rchild);                  printf(")");              }          }      }      void DestroyBTNode(BTNode *&b)   //销毁二叉树      {          if (b!=NULL)          {              DestroyBTNode(b->lchild);              DestroyBTNode(b->rchild);              free(b);          }      }      void LevelOrder(BTNode *b)      {BTNode *p;          BTNode *qu[MaxSize];    //定义环形队列,存放节点指针          int front,rear; //定义队头和队尾指针          front=rear=-1;      //置队列为空队列          rear++;          qu[rear]=b;          while(front!=rear)          {              front=(front+1)%MaxSize;              p=qu[front];//队头出队列              printf("%c ",p->data);  //访问节点              if(p->lchild!=NULL)              {                  rear=(rear+1)%MaxSize;                  qu[rear]=p->lchild;                    }              if(p->rchild!=NULL)              {                  rear=(rear+1)%MaxSize;                  qu[rear]=p->rchild;              }          }      }      

main.cpp:

#include <stdio.h>  #include <malloc.h>  #include "btree.h"    BTNode *CreateBT1(char *pre,char *in,int n)  /*pre存放先序序列,in存放中序序列,n为二叉树结点个数, 本算法执行后返回构造的二叉链的根结点指针*/  {      BTNode *s;      char *p;      int k;      if (n<=0) return NULL;      s=(BTNode *)malloc(sizeof(BTNode));     //创建二叉树结点*s      s->data=*pre;      for (p=in; p<in+n; p++)                 //在中序序列中找等于*ppos的位置k          if (*p==*pre)                       //pre指向根结点              break;                          //在in中找到后退出循环      k=p-in;                                 //确定根结点在in中的位置      s->lchild=CreateBT1(pre+1,in,k);        //递归构造左子树      s->rchild=CreateBT1(pre+k+1,p+1,n-k-1); //递归构造右子树      return s;  }    int main()  {      ElemType pre[]="ABDGCEF",in[]="DGBAECF";      BTNode *b1;      b1=CreateBT1(pre,in,7);      printf("b1:");      DispBTNode(b1);      printf("\n");      return 0;  }  
运行结果:

知识点总结:用二叉树 解决实际问题

0 0
原创粉丝点击