实验三 二叉树基本操作的实现
l 实验目的
1、二叉树的基本操作
(1)掌握二叉树链表的结构和二叉排序树的建立过程。
(2)掌握二叉树排序树的插入和删除操作。
(3)加深对二叉树的理解,逐步培养解决实际问题的编程能力。
2、树的遍历和哈夫曼树
(1)掌握用递归方法实现二叉树遍历的操作。
(2)掌握用非递归方法实现二叉树遍历的操作。
(3)掌握建立Huffman树的操作。
(4)加深对二叉树的理解,逐步培养解决实际问题的编程能力。
l 实验内容
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)程序源代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#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=