zoukankan      html  css  js  c++  java
  • 【C语言】数据结构C语言版 实验7 二叉树

    /*
    编写算法函数void preorder1(bintree t)实现二叉树t的非递归前序遍历。
    */
    #include "bintree.h"
    char *a="ABC##D#E##F##";  /*扩充二叉树序树t的前序序列*/
    /*函数preorder1()的功能是非递归前序遍历二叉树t,请将函数补充完整并调试运行*/
    void preorder1(bintree t)
    {
        seqstack s;//顺序栈s 
        s.top=0;
        while((t) || (s.top!=0)) //当前处理的子树不为空或栈不为空则循环 
        {
            if(t)
            {
                printf("%c ",t->data);
                push(&s,t);
                t=t->lchild;
            }
            else
            {
                t=pop(&s);
                t=t->rchild;
            }
        }
    }
    int main()
    {   bintree t;
        t=creatbintree();   /*建立二叉树t的存储结构*/
        printf("二叉树的前序序列为:
    ");
        preorder1(t);       /*前序非递归遍历二叉树*/
        return 0;
    }
    /*
    编写算法函数void levelbintree(bintree t),实现二叉树的层次遍历。
    */
    #include "bintree.h"
    char *a="ABC##D#E##F##";              /*扩充二叉树序树t的前序序列*/
    void levelbintree(bintree t)
    {
        bintree queue[100];
        int f=0,r=1;
        bintree p;
        queue[0]=t;
        while(f<r)
        {
            p=queue[f]; f++; printf("%c",p->data);
            if(p->lchild)
                queue[r++]=p->lchild;
            if(p->rchild)
                queue[r++]=p->rchild;
        }
    }
    int main()
    {   bintree t;
        t=creatbintree();       /*建立二叉树t的存储结构*/
        printf("二叉树的层次序列为:
    ");
        levelbintree(t);       /*层次遍历二叉树*/
        return 0;
    }
    /*
    编写函数bintree prelist(bintree t),bintree postfirst(bintree t),
    分别返回二叉树t在前序遍历下的最后一个结点地址和后序遍历下的第一个结点地址。
    */
    #include "bintree.h"
    char *a="ABC##D##EF#G###";  /*扩充二叉树序树t的前序序列*/
    bintree prelast(bintree t)
    {    //右下叶子结点                                                
        bintree p;
        if(t)
        {
            p=t;
            while(p&&p->lchild||p->rchild)
            {
                if(p->rchild)
                {
                    p=p->rchild;
                }
                else
                {
                    p=p->lchild;
                }
            }
        }
        return p; //返回前序序列最后一个结点G 
    }
    bintree postfirst(bintree t)
    {                //后序遍历是左子树-右子树-根结点 ,二叉树的左下叶子结点是第一个 
        bintree p;
        if(t)
        {
            while(p&&p->lchild||p->rchild)
            {
                if(p->lchild)
                {
                    p=p->lchild;
                }
                else
                {
                    p=p->rchild;
                }
            }
        }
        return p;//返回后序序列第一个结点 C
    }
    int main()
    {   bintree t,p,q;
        t=creatbintree();       /*建立二叉树t的存储结构*/
         p=prelast(t);
        //q=postfirst(t);
        if (t!=NULL)
                { printf("前序遍历最后一个结点为:%c
    ",p->data);
                  // printf("后序遍历第一个结点为:%c
    ",q->data);
                }
         else    printf("二叉树为空!");
        return 0;
    }
    /*
    假设二叉树采用链式方式存储,t为其根结点,编写一个函数int Depth(bintree t, char x),求值为x的结点在二叉树中的层次。
    */
    #include "bintree.h"
    char *a="ABC##D##EF#G###";          /*扩充二叉树序树t的前序序列*/
    /*
         函数Depth,功能:求结点x所在的层次
    */
    int Depth(bintree t,char x)
    {
        int num1,num2,n;//num1,num2分别记录在左子树,右子树中查找到x的层数,n记录最终返回的结果层数
        if(t==NULL)
        {
            return 0;
        }
        else
        {
            if(t->data==x)
            {
                return 1;
            }
            num1=Depth(t->lchild,x);
            num2=Depth(t->rchild,x);
            n=num1+num2; //num1和num2之中必有一个为0 
            if(num1!=0||num2!=0) //找到了x ,往回数 
            {
                n++;
            }
        }
        return n;
    }
    int main()
    {  bintree root;
       char x;
       int k=0;
       root=creatbintree();
       printf("请输入树中的1个结点值:
    ");
       scanf("%c",&x);
       k=Depth(root,x);
       printf("%c结点的层次为%d
    ",x,k);
    }
     
    /*
       试编写一个函数,将一棵给定二叉树中所有结点的左、右子女互换。
    */
    #include "bintree.h"
    char *a="ABC##D##EF#G###";          /*扩充二叉树序树t的前序序列*/
    /*请将本函数补充完整,并进行测试*/
    void change(bintree t)
    {
        bintree p;
        if(t)
        {
            p=t->lchild; //交换 
            t->lchild=t->rchild;
            t->rchild=p;
            change(t->lchild); //继续递归 
            change(t->rchild);
        }
    }
    int main()
    {  bintree root;
       root=creatbintree();
       change(root);
       preorder(root);
    }
    /*
    试编写一个递归函数bintree buildBintree(char *pre, char *mid, int length),
    根据二叉树的前序序列pre、中序序列mid和前序序列长度length,构造二叉树的二叉链表存储结构,
    函数返回二叉树的树根地址。
    */
    #include "bintree.h"
    #include <string.h>
    char *a="";
    /*请将本函数补充完整,并进行测试*/
    bintree buildBintree(char *pre, char *mid,int length)
    {
        bintree t;
        int i=0;
        if(length)
        {
            t=(bintree)malloc(sizeof(binnode)); //生成新结点
            t->data=pre[i];
            while(i<length&&mid[i]!=pre[0])     //在中序遍历中查找根结点的位置
                i++;
            t->lchild=buildBintree(pre+1,mid,i);
            t->rchild=buildBintree(pre+i+1,mid+i+1,length-i-1);
        }
        else
            return NULL;
        return t;
    }
    int main()
    {   bintree root;
        char pre[100],mid[100];
        puts("请输入前序序列:");
        gets(pre);
        puts("请输入中序序列:");
        gets(mid);
        root=buildBintree(pre,mid,strlen(pre));
        puts("后序序列是:");
        postorder(root);
    }
    /*bintree.h头文件*/
    #include<stdio.h>
    #include<stdlib.h>
    #define N 100
    extern char *a;
    typedef struct node
    {    
        char data;
        struct node *lchild, *rchild;
    }binnode;
    typedef binnode *bintree;
    /*函数creatbintree(根据扩充二叉树的前序序列(字符a)建立二叉树t的存储结构)*/
    binnode  creatbintree()
    {
        char ch = *a++;
        bintree t;
        if (ch == '#') t = NULL;
        else
        {
            t = (bintree)malloc(sizeof(binnode));
            t->data = ch;
            t->lchild = creatbintree();
            t->rchild = creatbintree();
        }
        return t;
    }
  • 相关阅读:
    我的2007, 兼谈些对技术的看法
    回帖整理: 关于"学习Java社区"更清晰的思路
    回帖整理: 创业心态
    我的世界观 by 爱因斯坦
    回帖整理: 论团队中的设计工作
    请大家帮我一个忙
    回帖整理: Java社区有什么可学的?
    SSL原理及应用(1)SSL协议体系结构
    文件和目录的访问控制(4) 审核规则
    强名称(2)引用强名称签名的程序集
  • 原文地址:https://www.cnblogs.com/HGNET/p/14109754.html
Copyright © 2011-2022 走看看