数据结构二叉树习题

1.问题描述:

 二叉树结点值为大写字母,输入二叉树的前序遍历和中序遍历序列,生成此二叉树,输出该二叉树的后序遍历和按层次遍历序列。输入某结点值,在二叉树中查找该结点,若该结点存在,则输出从根到该结点的路径,否则给出不存在信息。

2.算法思路:

  树的创建:将树的前序序列和中序序列分别存入两个数组中,前序序列的第一个值为树的根节点,在中序序列里找到该值,便可知道根节点的左子树的结点数和右子树的结点数。根据左子树的结点数和右子树的结点数可以将这两个数组分割为左子树部分和右子树部分,继续分别创建树。采用递归便可完成。(注:为方便后续使用,树的结点有左孩,右孩,父母三个指针。)

  后序遍历:用递归即可实现,注意为空的情况。

  层次遍历:采用队列进行层次遍历。先将树根入队列,然后进入循环。每出队列中的一个节点,就将该节点的左孩,右孩先后入队列,直到队列中没有节点为止。

  查找结点:用前序递归遍历树,每遍历一个结点就对该结点值与查找值进行比对,一旦相同则返回该结点指针,否则继续遍历,没有则返回空。

  输出树根到结点的路径:根据结点指针,沿它的父母指针向上递归遍历,出口为根节点的父母指针为空。先遍历祖先,再输出结点值,便可以得到从树根到结点的路径。

3.算法描述:

 1.结点的结构体中除了字符数据,还有它的左孩子,右孩子,父母的指针。

 2.creat(树的创建函数):

    传入:树的前序序列数组pre[],树的中序序列数组in[],树的前序序列数组的起始点a和结束点b,树的中序序列数组的起始点c和结束点d.

    返回:树的根节点的指针(node *)

    函数内容:

         动态申请根节点空间,赋根植,若前序数组中只有一个值,即该树只有根节点,将根结点的左右孩子均赋为空,返回根节点。在中序序列里找到根节点并记录其位置,就可以得到左子树的结点数和右子树的结点数,然后将数组划分为左子树和右子树部分。如果左子树为空,则根节点左孩子赋为空,否则继续调用本函数,根据左子树的结点数对数组界限进行修改,将返回值赋即左子树的根结点指针赋给根结点的左孩子,并且赋根结点的值给左孩子的父母指针。右边类似。

 3.levelorder(按层次遍历函数):

    需要传入:树的根结点指针(node  *),无返回值

    函数内容:建立队列,并将根节点入队列。进入循环(出一个队列中的元素,并将其输出,然后将该元素的左孩子,右孩子先后入队列),出口条件为队列为空。

 4.postorder(后序遍历函数):

    需要传入:树的根结点指针(node  *)   ,void

    函数内容:根结点不为空时,递归调用本函数后序遍历左子树,继续调用本函数后序遍历右子树,然后输出根结点值。

 5.search(查找结点函数):
    
    需要传入:树的根结点指针(node *) ,返回:找到结点的指针(node  *),没有则返回空(NULL)

    函数内容:若根结点为空则返回空。根结点不为空时判断根结点是否为待找结点,是则返回。若不是则继续调用本函数查找左子树,若返回值不为空则返回该返回值,否则继续调用本函数查找右子树,并将返回值返回。

 6.path(输出根到结点的路径函数):

       需要传入:结点指针(node  *)    无返回值

       函数内容:结点指针不为空时,调用该函数以输出该结点的父母指针的路径,然后输出该结点的值。



7.主函数:将树的前序序列和中序序列读入并存入字符数组中,依次调用creat(创建树函数),display(输出树函数),postorder(后序遍历树函数),levelorder(层次遍历树函数),search(查找节点函数),path(输出从根到结点的路径函数),完成该程序。

4.源程序:



#include<head.h>

node *creat(char pre[maxnode],char in[maxnode],int
a,int b,int c,int d){
   

        node *ptr;

        int i;

        

        ptr=(node
*)malloc(sizeof(node));

        if(!ptr)
exit(1);

        

        ptr->data=pre[a];

        

        if(a==b){
   

             ptr->lc=NULL;

             ptr->rc=NULL;

             return
ptr;

        }

        

        for(i=c;in[i]!=pre[a];i++);

             

        if(i!=c){
   

             ptr->lc=creat(pre,in,a+1,
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值