数据机构实验报告-实验三 二叉树基本操作的实现

实验三   二叉树基本操作的实现

 

实验目的

1、二叉树的基本操作

(1)掌握二叉树链表的结构和二叉排序树的建立过程。

(2)掌握二叉树排序树的插入和删除操作。

(3)加深对二叉树的理解,逐步培养解决实际问题的编程能力。

2、树的遍历和哈夫曼树

(1)掌握用递归方法实现二叉树遍历的操作。

(2)掌握用非递归方法实现二叉树遍历的操作。

(3)掌握建立Huffman树的操作。

(4)加深对二叉树的理解,逐步培养解决实际问题的编程能力。

实验内容

1、二叉树的基本操作

(一)基础题

(1)SearchNode(TREE *tree,int key,TREE **pkpt,TREE **kpt)查找结点函数;

(2)InsertNode(TREE **tree,int key)二叉排序树插入函数;

(3)DeleteNode(TREE **tree,int key)二叉排序树删除函数;

2.调用上述函数实现下列操作:

(1)初始化一棵二叉树;

(2)调用插入函数建立一棵二叉排序树;

(3)调用查找函数在二叉树中查找指定的结点;

(二)提高题

【问题描述】已知以二叉树链表作为存储结构,试编写按中序遍历并打印二叉树的算法。

【程序设计思路】采用一个栈,先将二叉树的根结点入栈,若它有左子树,便将左子树的根节点入栈,直到左子树为空,然后依次退栈并输出结点值;若输出的结点有右子树,便将右子树的根结点入栈,如此循环入栈、退栈,直到栈为空为止。

 

2、树的遍历和哈夫曼树

(1)re_preorder(TREE *tree) 先序遍历,采用递归方法;

(2)re_midorder(TREE *tree)中序遍历,采用递归方法;

(3)re_posorder(TREE *tree) 后序遍历,采用递归方法;

(4)st_preorder(TREE *tree)先序遍历,采用链接栈的迭代方法;

(5)st_midorder(TREE *tree)中序遍历,采用链接栈的迭代方法;

(6)st_posorder(TREE *tree)后序遍历,采用链接栈的迭代方法;

2.调用上述函数实现下列操作:

(1)用递归方法分别实现先序、中序和后序遍历二叉树;

(2)用非递归方法分别实现先序、中序和后序遍历二叉树。

(3)程序源代码

#include<stdio.h>

#include<malloc.h>

#include<conio.h>

#include <windows.h>

#include<stdlib.h>

typedef struct tree /* 定义树的结构*/

{

    int data;              /*假定树的元素类型为int*/

    struct tree *lchild;   /*左孩子*/

    struct tree *rchild;   /*右孩子*/

}TREE;

typedef struct stack /*定义链接栈结构*/

{

    TREE *t;   /*栈结点元素为指向二叉树结点的指针*/

    int flag;  /*后序遍历时用到该标志*/

    struct stack *link;/*栈结点链接指针*/

}STACK;

void gotoxy(int x,int y)    //x为列坐标,y为行坐标

{

    COORD pos={x,y};    //设定坐标

    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);    //函数句柄

    SetConsoleCursorPosition(hOut,pos);

}

void push(STACK **top,TREE *tree)/*树结点入栈*/

{

    STACK *p;   /*工作指针*/

    p=(STACK*)malloc(sizeof(STACK));/*申请栈结点*/

    p->t=tree;   /*根结点进栈*/

    p->link=*top; /*新栈结点指向栈顶*/

    *top=p;  /*栈顶为新结点*/

}

void pop(STACK **top,TREE **tree)/*出栈*/

{

    STACK *p;

    if(*top==NULL)

        *tree=NULL;

    else

    {

        *tree=(*top)->t;

        p=*top;

        *top=(*top)->link;

        free(p);

    }

}

void SearchNode(TREE *tree,int key,TREE **pkpt,TREE **kpt)/*查找树的根结点*/

{

    *pkpt=NULL;

    *kpt=tree;

    while(*kpt!=NULL)

    {

        if((*kpt)->data==key)

            return;

        *pkpt=*kpt;

        if(key<(*kpt)->data)

            *kpt=(*kpt)->lchild;

        else

            *kpt=(*kpt)->rchild;

    }

}

int InsertNode(TREE **tree,int key) /*在查找树上插入新结点,返回1表示该键值结点已存在,返回-1表示内存申请失败*/

{

    TREE *p,*q,*r;

    SearchNode(*tree,key,&p,&q);

    if(q!=NULL)

        return 1;

        if((r=(TREE*)malloc(sizeof(TREE)))==NULL)

            return -1;

        r->data=key;

        r->lchild=r->rchild=NULL;

        if(p==NULL)

            *tree=
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值