二叉树的建立与遍历
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一 、实验目的
1.学会实现二叉树结点结构和对二叉树的基本操作。 2.掌握对二叉树每种操作的具体实现,学会利用递归方法编写对二 叉树这种递归数据结构进行处理的算法。
二 、实验要求
1.认真阅读和掌握二叉树的结构、构造和遍历等内容。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。
//树 typedef struct Node {ElemType data; struct Node *lchild,*rchild; }BiTNode,*BiTree; //栈 typedef struct {BiTree *base; BiTree *top; int stacksize;//当前已分配的存储空间 }SqStack; //———————————————————————————— //构造一个空栈 Status InitStack(SqStack &S) {S.base = (BiTree *) malloc(sizeof(BiTree)); if(!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INT_SIZE; return OK; } //插入元素e为栈顶元素 Status Push(SqStack &S, BiTree e) { if(S.top - S.base >= S.stacksize) { //若栈满,则追加存储空间 S.base=(BiTree*)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(BiTree)); if(!S.base) return ERROR; S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top = e; S.top++; return OK; } //删除S的栈顶元素,并用e返回 Status Pop(SqStack &S,BiTree &e)
{ if ((!T->lchild&&T->rchild)|| (!T->rchild&&T->lchild)) count++; // 对结点计数 Count( T->lchild, count); Count( T->rchild, count);
} } 2. #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef bool Status; #define OK 1 #define ERROR 0 #define OVERFLOW -2
{Visit(T->data);
// 访问结点
PreOrder(T->lchild); // 遍历左子树
PreOrder(T->rchild);// 遍历右子树
}
return OK;
}
//中序遍历
Status InOrder(BiTree &T)
{if(T)
{InOrder(T->lchild);
// 若栈S为空栈,则返回OK,否则返回ERROR Status StackEmpty(SqStack S) { if(S.top == S.base) return OK; else return ERROR; } //---------------------------------------------------------------------------------------------------//先序创建二叉树 Status CreatBiTree(BiTree &T,BiTree q) {int ch;
BiTree p; p=q; scanf("%d",&ch);
if(ch==0) T=NULL; else
{if(!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=ch; T->parent=p; p=T; CreatBiTree(T->lchild,p ); CreatBiTree(T->rchild,p ); } return OK; } BiTree Search(BiTree &T,int e) {BiTree p; SqStack S; InitStack(S); p=T; while(p||!StackEmpty(S)) {if(p) { if(p->data==e) return p;
{ if(S.base == S.top) return ERROR; S.top--; e = *S.top; return OK; } // 若栈S为空栈,则返回OK,否则返回ERROR Status StackEmpty(SqStack S) { if(S.top == S.base) return OK; else return ERROR; } //--------------------------------------------------------------------------------------------------------------//先序创建二叉树 Status CreatBiTree(BiTree &T) {int ch; scanf("%d",&ch);
}
//求二叉树的深度(后序遍历)
int Depth(BiTree &T)
{ int depthval,depthLeft,depthRight;
if(!T) depthval=0;
else
{depthLeft=Depth(T->lchild);
depthRight=Depth(T->rchild);
printf("\n"); printf("中序遍历:"); InOrder(root); printf("\n"); printf("后序遍历:"); PostOrder(root); printf("\n"); printf("树的深度为:"); printf("%d\n",Depth(root)); printf("先序遍历(非递归):"); InOrderTraverse(root); printf("\n度数为1的结点数为:"); Count(root,count); printf("%d",count); printf("\n"); }
#define STACK_INT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 //树 typedef struct Node {ElemType data; struct Node *lchild,*rchild,*parent; }BiTNode,*BiTree; //栈 typedef struct {BiTree *base; BiTree *top; int stacksize;//当前已分配的存储空间 }SqStack; // —————————————————————————————————— //构造一个空栈 Status InitStack(SqStack &S) {S.base = (BiTree *) malloc(sizeof(BiTree)); if(!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INT_SIZE; return OK;
#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef bool Status; #define OK 1 #define ERROR 0 #define OVERFLOW -2
#define STACK_INT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量
if(ch==0) T=NULL; else
{if(!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=ch; CreatBiTree(T->lchild ); CreatBiTree(T->rchild ); } return OK; } //访问数据 Status Visit(ElemType e) { printf("%d ",e); return OK; } //先序遍历二叉树 Status PreOrder(BiTree T) {if(T)
Visit(T->data);
InOrder(T->rchild);
}
return OK;
}
//后序遍历
Status PostOrder(BiTree & T)
{if(T)
{PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T->data);
}
return OK;
} //插入元素e为栈顶元素 Status Push(SqStack &S, BiTree e) { if(S.top - S.base >= S.stacksize) { //若栈满,则追加存储空间 S.base = (BiTree *) realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(BiTree)); if(!S.base) return ERROR; S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top = e; S.top++; return OK; } //删除S的栈顶元素,并用e返回 Status Pop(SqStack &S,BiTree &e) { if(S.base == S.top) return ERROR; S.top--; e = *S.top; return OK; }
五、实验结果与讨论
(描述最终得到的结果,并进行分析说明,可能的误差原因)
六、总结
(说明实验过程中遇到的问题及解决办法;新发现或个人的收获;未解决/需进一步研讨的问题 或建议新实验方法等)
七、思考与提高
1.如何计算二叉链表存储的二叉树中度数为1的结点数? 2.已知有—棵以二叉链表存储的二叉树,root指向根结点,p指向 二叉树中任一结点,如何求从根结点到p所指结点之间的路径? 1.void Count(BiTree T, int& count) { if ( T )
三、实验内容
1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉 树,采用三种递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历 并计算出二叉树的高度。
2 .编写程序生成下面所示的二叉树,并采用先序遍历的非递归算法 对此二叉树进行遍历。
四、实验步骤
(描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间 结果) 代码:
{if(p) { printf("%2d",p->data); Push(S,p); p=p->lchild; }
else {Pop(S,p); p=p->rchild ; }
} return OK; } //计算二叉链表存储的二叉树中度数为1的结点数 void Count(BiTree T, int& count) {
depthval=1+(depthLeft>depthRight?depthLeft:depthRight);
} return depthval; } //先序遍历二叉树非递归算法
Status InOrderTraverse(BiTree &T) {BiTree p; SqStack S; InitStack(S); p=T; while(p||!StackEmpty(S))
if ( T ) {
if ((!T->lchild&&T->rchild)|| (!T->rchildLeabharlann Baidu&T->lchild)) count++; // 对结点计数
Count( T->lchild, count); Count( T->rchild, count); } } void main() {BiTree root; int count=0; root=NULL; printf("先序输入数据(以'0'为空):"); CreatBiTree(root); printf("先序遍历:"); PreOrder(root);
1.学会实现二叉树结点结构和对二叉树的基本操作。 2.掌握对二叉树每种操作的具体实现,学会利用递归方法编写对二 叉树这种递归数据结构进行处理的算法。
二 、实验要求
1.认真阅读和掌握二叉树的结构、构造和遍历等内容。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。
//树 typedef struct Node {ElemType data; struct Node *lchild,*rchild; }BiTNode,*BiTree; //栈 typedef struct {BiTree *base; BiTree *top; int stacksize;//当前已分配的存储空间 }SqStack; //———————————————————————————— //构造一个空栈 Status InitStack(SqStack &S) {S.base = (BiTree *) malloc(sizeof(BiTree)); if(!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INT_SIZE; return OK; } //插入元素e为栈顶元素 Status Push(SqStack &S, BiTree e) { if(S.top - S.base >= S.stacksize) { //若栈满,则追加存储空间 S.base=(BiTree*)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(BiTree)); if(!S.base) return ERROR; S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top = e; S.top++; return OK; } //删除S的栈顶元素,并用e返回 Status Pop(SqStack &S,BiTree &e)
{ if ((!T->lchild&&T->rchild)|| (!T->rchild&&T->lchild)) count++; // 对结点计数 Count( T->lchild, count); Count( T->rchild, count);
} } 2. #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef bool Status; #define OK 1 #define ERROR 0 #define OVERFLOW -2
{Visit(T->data);
// 访问结点
PreOrder(T->lchild); // 遍历左子树
PreOrder(T->rchild);// 遍历右子树
}
return OK;
}
//中序遍历
Status InOrder(BiTree &T)
{if(T)
{InOrder(T->lchild);
// 若栈S为空栈,则返回OK,否则返回ERROR Status StackEmpty(SqStack S) { if(S.top == S.base) return OK; else return ERROR; } //---------------------------------------------------------------------------------------------------//先序创建二叉树 Status CreatBiTree(BiTree &T,BiTree q) {int ch;
BiTree p; p=q; scanf("%d",&ch);
if(ch==0) T=NULL; else
{if(!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=ch; T->parent=p; p=T; CreatBiTree(T->lchild,p ); CreatBiTree(T->rchild,p ); } return OK; } BiTree Search(BiTree &T,int e) {BiTree p; SqStack S; InitStack(S); p=T; while(p||!StackEmpty(S)) {if(p) { if(p->data==e) return p;
{ if(S.base == S.top) return ERROR; S.top--; e = *S.top; return OK; } // 若栈S为空栈,则返回OK,否则返回ERROR Status StackEmpty(SqStack S) { if(S.top == S.base) return OK; else return ERROR; } //--------------------------------------------------------------------------------------------------------------//先序创建二叉树 Status CreatBiTree(BiTree &T) {int ch; scanf("%d",&ch);
}
//求二叉树的深度(后序遍历)
int Depth(BiTree &T)
{ int depthval,depthLeft,depthRight;
if(!T) depthval=0;
else
{depthLeft=Depth(T->lchild);
depthRight=Depth(T->rchild);
printf("\n"); printf("中序遍历:"); InOrder(root); printf("\n"); printf("后序遍历:"); PostOrder(root); printf("\n"); printf("树的深度为:"); printf("%d\n",Depth(root)); printf("先序遍历(非递归):"); InOrderTraverse(root); printf("\n度数为1的结点数为:"); Count(root,count); printf("%d",count); printf("\n"); }
#define STACK_INT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 //树 typedef struct Node {ElemType data; struct Node *lchild,*rchild,*parent; }BiTNode,*BiTree; //栈 typedef struct {BiTree *base; BiTree *top; int stacksize;//当前已分配的存储空间 }SqStack; // —————————————————————————————————— //构造一个空栈 Status InitStack(SqStack &S) {S.base = (BiTree *) malloc(sizeof(BiTree)); if(!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INT_SIZE; return OK;
#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef bool Status; #define OK 1 #define ERROR 0 #define OVERFLOW -2
#define STACK_INT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量
if(ch==0) T=NULL; else
{if(!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=ch; CreatBiTree(T->lchild ); CreatBiTree(T->rchild ); } return OK; } //访问数据 Status Visit(ElemType e) { printf("%d ",e); return OK; } //先序遍历二叉树 Status PreOrder(BiTree T) {if(T)
Visit(T->data);
InOrder(T->rchild);
}
return OK;
}
//后序遍历
Status PostOrder(BiTree & T)
{if(T)
{PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T->data);
}
return OK;
} //插入元素e为栈顶元素 Status Push(SqStack &S, BiTree e) { if(S.top - S.base >= S.stacksize) { //若栈满,则追加存储空间 S.base = (BiTree *) realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(BiTree)); if(!S.base) return ERROR; S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top = e; S.top++; return OK; } //删除S的栈顶元素,并用e返回 Status Pop(SqStack &S,BiTree &e) { if(S.base == S.top) return ERROR; S.top--; e = *S.top; return OK; }
五、实验结果与讨论
(描述最终得到的结果,并进行分析说明,可能的误差原因)
六、总结
(说明实验过程中遇到的问题及解决办法;新发现或个人的收获;未解决/需进一步研讨的问题 或建议新实验方法等)
七、思考与提高
1.如何计算二叉链表存储的二叉树中度数为1的结点数? 2.已知有—棵以二叉链表存储的二叉树,root指向根结点,p指向 二叉树中任一结点,如何求从根结点到p所指结点之间的路径? 1.void Count(BiTree T, int& count) { if ( T )
三、实验内容
1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉 树,采用三种递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历 并计算出二叉树的高度。
2 .编写程序生成下面所示的二叉树,并采用先序遍历的非递归算法 对此二叉树进行遍历。
四、实验步骤
(描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间 结果) 代码:
{if(p) { printf("%2d",p->data); Push(S,p); p=p->lchild; }
else {Pop(S,p); p=p->rchild ; }
} return OK; } //计算二叉链表存储的二叉树中度数为1的结点数 void Count(BiTree T, int& count) {
depthval=1+(depthLeft>depthRight?depthLeft:depthRight);
} return depthval; } //先序遍历二叉树非递归算法
Status InOrderTraverse(BiTree &T) {BiTree p; SqStack S; InitStack(S); p=T; while(p||!StackEmpty(S))
if ( T ) {
if ((!T->lchild&&T->rchild)|| (!T->rchildLeabharlann Baidu&T->lchild)) count++; // 对结点计数
Count( T->lchild, count); Count( T->rchild, count); } } void main() {BiTree root; int count=0; root=NULL; printf("先序输入数据(以'0'为空):"); CreatBiTree(root); printf("先序遍历:"); PreOrder(root);