二叉树

资料

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);
}

C++版的二叉树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵健zj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值