求树和二叉树的深度题目及源程序代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
树和二叉树
以下问题要求统一在一个大程序里解决。
10、按先序遍历的扩展序列建立二叉树的存储结构
11、二叉树先序、中序、后序遍历的递归算法
12、二叉树中序遍历的非递归算法
13、二叉树层次遍历的非递归算法
14、求二叉树的深度(后序遍历)
15、建立树的存储结构
16、求树的深度
17、
源程序代码:
// tree.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
typedef char TElemType; // 元素数据类型
typedef int Status;
/* 二叉链表储存结构*/
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
bool CreateBiTree(BiTree &T) {
//先序序列建立二叉树
char ch;
scanf("%c",&ch);
if (ch=='*') T = NULL;
else {
if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR; T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
Status PrintElement(TElemType e) {
// 访问函数
printf("%c", e);
return OK;
}
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //先序遍历二叉树的递归算法
if (T) {
if (Visit(T->data))
if (PreOrderTraverse(T->lchild, Visit))
if (PreOrderTraverse(T->rchild, Visit)) return OK;
return ERROR;
}else return OK;
}
Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //中序遍历二叉树的递归算法
if (T) {
if (InOrderTraverse(T->lchild, Visit))
if (Visit(T->data))
if (InOrderTraverse(T->rchild, Visit)) return OK;
return ERROR;
}else return OK;
}
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //后序遍历二叉树的递归算法
if (T) {
if (PostOrderTraverse(T->lchild, Visit))
if (PostOrderTraverse(T->rchild, Visit))
if (Visit(T->data)) return OK;
return ERROR;
}else return OK;
}
/* 栈存储结构及操作
*/
typedef struct {
BiTree *base;
BiTree *top;
int stacksize;
}Stack;
Status InitStack(Stack &S) {
//构造空栈
S.base = (BiTree*)malloc(STACK_INIT_SIZE * sizeof(BiTree)); if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status GetTop(Stack S, BiTree &e){
//读栈顶元素
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return OK;
}
Status Push(Stack &S, BiTree e){
//入栈
if (S.top - S.base >= S.stacksize) {
S.base = (BiTree*)realloc(S.base, (S.stacksize + STACKINCREMENT) *
sizeof(BiTree));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
Status Pop(Stack &S, BiTree &e){
//出栈
if (S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}
Status StackEmpty(Stack S){
//判栈空
if (S.base == S.top) return TRUE;