资料
C语言实现常用数据结构——二叉树
【数据结构 严蔚敏版】 二叉树 基本操作
二叉树的基本操作
// CPPTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include "testaa.h"
#include <string>
#include <limits>
#include <ctime>
#include <cstdlib>
#include <string>
#include <ctime>
#include <cstring>
#include "Box.h"
#include "A.h"
#include "FJUtils.h"
using namespace std;
#define MAX_TREE_SIZE 100 //二叉树的最大节点数
#define STATUS_OK 1
#define STATUS_FAIL 2
typedef int Status;
typedef struct BiTNode {
int data;
struct BiTNode* lchild, * rchild;
}BiTNode, *BiTree;
//定义队列节点
typedef struct QNode {
BiTNode* data;
struct QNode* next;
}QNode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
// 队列的操作
// 建立队列
Status InitQueue(LinkQueue& Q);
// 入队
Status EnQueue(LinkQueue& Q, BiTree& T);
// 判空
Status QueueEmpty(LinkQueue Q);
// 元素出队列
Status DeQueue(LinkQueue& Q, BiTree& T);
// 遍历队列元素
Status QueueTraverse(LinkQueue Q);
BiTNode* initNode(BiTNode* t, char x) {
if (t == NULL) {
t = (BiTNode*)malloc(sizeof(BiTNode));
t->data = x;
t->lchild = NULL;
t->rchild = NULL;
}
else if (t->lchild == NULL) {
t->lchild = initNode(t->lchild, x);
return t;
}
else {
t->rchild = initNode(t->rchild, x);
return t;
}
}
//------基本操作的函数原型说明--------
Status CreateBiTree(BiTree& T);
//按先序次序输入二叉树中节点的值(一个字符),空格字符表示空树
//构造二叉树表示的二叉树T
Status PreOrderTraverse(BiTree T, int level);
//采用二叉树链表存储结构,Visit是对节点操作的应用函数
//先序遍历二叉树T,对每个节点调用函数Visit一次且近义词
//一旦Visit()失败,则 操作失败
Status InOrderTraverse(BiTree T, int level);
//采用二叉链表存储结构,Visit是对节点操作的应用函数
//中序遍历二叉树T,对每个节点调用函数Visit一次且仅以此
//一旦visit失败,则操作失败
Status PostOrderTraverse(BiTree T, int level);
//采用二叉链表存储结构,Visit是对节点操作的应用函数
//后序遍历二叉树T,对每个节点调用函数Visit一次且仅以此
//一旦visit()失败,则操作失败
Status LevelOrderTraverse(BiTree T, Status(*Visit)(int e));
//采用二叉链表存储结构,Visit是对节点操作的应用函数
//层序遍历二叉树T,对每个节点调用函数Visit一次且仅一次
//一旦visit()失败,则操作失败
void testBiTree();
void Menu();
// 变量声明
int main()
{
testBiTree();
return 0;
}
void Menu()
{
cout << " 二叉树基本操作 " << endl;
cout << "***************************************************" << endl;
cout << "********* 1.建立二叉树 *************" << endl;
cout << "********* 2.先序遍历二叉树 *************" << endl;
cout << "********* 3.中序遍历二叉树 *************" << endl;
cout << "********* 4.后序遍历二叉树 *************" << endl;
cout << "********* 5.层序遍历二叉树 *************" << endl;
cout << "********* 6.二叉树的高度 *************" << endl;
cout << "********* 7.二叉树叶子数 *************" << endl;
cout << "********* 8.完全二叉树 *************" << endl;
cout << "********* 9.清空二叉树 *************" << endl;
cout << "********* 10.退出 *************" << endl;
cout << "***************************************************" << endl;
}
static char chTmp;
static int index=0;
char getCharsFromCosntChar() {
char mycharts[] = "ABC@@DE@G@@F@@@";
int len = my_strlen(mycharts);
if (index < my_strlen(mycharts)) {
char c = mycharts[index];
index++;
return c;
}
return '@';
}
void testCreateBiTree() {
char mychars[] = "ABC@@DE@G@@F@@@";
int len = my_strlen(mychars);
BiTree T;
CreateBiTree(T);
printf("\n");
printf("先序遍历\n");
PreOrderTraverse(T, 1);
printf("中序遍历\n");
InOrderTraverse(T, 1);
printf("后序遍历\n");
PostOrderTraverse(T, 1);
}
void testBiTree() {
/*
BiTree T;
Menu();
printf_s("1.创建一棵二叉树:");
if (CreateBiTree(T))
{
printf("创建成功");
}
else {
printf("创建失败");
}
*/
testCreateBiTree();
}
// 队列操作
// 建立队列
Status InitQueue(LinkQueue& Q) {
Q.front = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front) {
printf("内存分配失败,程序退出!!");
exit(-1);
}
Q.rear = Q.front;
Q.front->next = NULL;
return STATUS_OK;
}
// 入队
Status EnQueue(LinkQueue& Q, BiTree& T) {
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if (!p) {
printf("内存分配失败,程序退出!!");
exit(-1);
}
p->data = T;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return STATUS_OK;
}
// 判空
Status QueueEmpty(LinkQueue Q) {
if (Q.front == Q.rear) {
return STATUS_FAIL;
}
else {
return STATUS_OK;
}
}
// 元素出队列
Status DeQueue(LinkQueue& Q, BiTree& T) {
QueuePtr p;
if (Q.front == Q.rear) {
return STATUS_FAIL;
}
p = Q.front->next;
T = p->data;
Q.front->next = p->next;
if (Q.rear==p) {
Q.rear = Q.front;
}
free(p);
return STATUS_OK;
}
// 遍历队列元素
Status QueueTraverse( LinkQueue Q) {
int i;
if (Q.front==Q.rear) {
return STATUS_FAIL;
}
for (i = 0; Q.front != Q.rear;i++) {
Q.front = Q.front->next;
printf("data=%c",Q.front->data->data);
}
printf("\n");
return STATUS_OK;
}
Status CreateBiTree(BiTree &T)
{
// 按先序次序输入二叉树中==≠≠≠节点的值(一个字符),空格字符表示空树
//构造二叉链表表示的二叉树T
char ch = getCharsFromCosntChar();
//int si = scanf("%c", &ch);
printf("CreateBiTree->输入的字符是:%c\n", ch);
if (ch == '@') {
T = NULL;
}
else {
if(!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch; //生成根节点
printf("CreateBiTree->创建左节点");
CreateBiTree(T->lchild);
printf("CreateBiTree->创建右节点");
CreateBiTree(T->rchild);
}
return STATUS_OK;
}
Status PreOrderTraverse(BiTree T,int level) {
if (T) {
printf("level-%d==>%c\n", level, T->data);//访问根节点
PreOrderTraverse(T->lchild, level + 1);//先遍历左zishu
PreOrderTraverse(T->rchild, level + 1);//最后遍历右字树
}
return STATUS_OK;
}
Status InOrderTraverse(BiTree T, int level) {
if (T) {
InOrderTraverse(T->lchild, level+1); //先遍历左子树
printf("level-%d==>%c\n", level, T->data);//访问根节点
InOrderTraverse(T->rchild, level+1);
}
return STATUS_OK;
}
Status PostOrderTraverse(BiTree T, int level) {
if (T) {
PostOrderTraverse(T->lchild, level + 1);//先访问左子树
PostOrderTraverse(T->rchild, level + 1);//再访问右子树
printf("level-%d==>%c\n", level, T->data);//访问根节点
}
return STATUS_OK;
}
c语言中的二叉树
#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
typedef struct Tree {
int data;
struct Tree *left;
struct Tree *right;
} tree;
int find(tree *t,int x) {
int i=0;
if(t==NULL) {
return -1;
}
if(t->data==x) {
return i;
} else if(x<t->data) {
i++;
find(t->left,x);
} else if(x>t->data) {
i++;
find(t->right,x);
}
}
tree *findMin(tree *t) {
if(t==NULL) {
return NULL;
} else if(t->left==NULL) {
return t;
} else {
return findMin(t->left);
}
}
int findMax(tree *t) {
if(t!=NULL) {
while(t->right!=NULL) {
t=t->right;
}
}
return t->data;
}
tree *init(tree *t,int x) {
if(t==NULL) {
t=malloc(sizeof(tree));
t->data=x;
t->left=NULL;
t->right=NULL;
return t;
} else if(t->left ==NULL) {
t->left=init(t->left,x);
return t;
} else {
t->right=init(t->right,x);
return t;
}
}
tree *insertSort(tree *t,int x) {
if(t==NULL) {
t=malloc(sizeof(tree));
t->data=x;
t->left=NULL;
t->right=NULL;
} else if(x < t->data) {
t->left=insertSort(t->left,x);
} else if(x > t->data) {
t->right=insertSort(t->right,x);
}
return t;
}
tree *delete(tree *t,int x) {
tree *temp;
if(t==NULL) {
printf("error,element not found!");
} else if( x < t->data ) {/*go left*/
t->left=delete(t->left,x);
} else if( x > t->data ) {/*go right*/
t->right=delete( t->right,x );
} else if( t->left && t->right) { /*t->data==x and t has two children*/
temp=findMin( t->right );
t->data=temp->data;
t->right=delete( t->right,t->data );
} else {/*one or zero children */
temp=t;
if( t->left==NULL) {
t=t->right;
} else if( t->right == NULL ) {
t=t->left;
}
free(temp);
}
return t;
}
void preTravel(tree *t) {
if(t==NULL) {
return;
}
printf("%d ",t->data);
preTravel(t->left);
preTravel(t->right);
}
void midTravel(tree *t) {
if(t==NULL) {
return;
}
midTravel(t->left);
printf("%d ",t->data);
midTravel(t->right);
}
void postTravel(tree *t) {
if(t==NULL) {
return;
}
postTravel(t->left);
postTravel(t->right);
printf("%d ",t->data);
}
main() {
tree *t;
int i;
for(i=0; i<SIZE; i++) {
t=init(t,i);
}
preTravel(t);
printf("\n");
midTravel(t);
printf("\n");
postTravel(t);
}
728

被折叠的 条评论
为什么被折叠?



