1.头文件
typedef struct BinTree* BTree;
typedef int ElemData;
//二叉有序数左子树的值小于根节点与右子数
typedef struct BinTree{
BTree left;
BTree right;
BTree parent;
ElemData data;
}BinTree;
//初始化只有ROOT节点的树
void initTree(BTree* bTree,ElemData e);
//创建一个树节点
BTree createNode();
BTree findNode(BTree bTree,ElemData e);
//插入一个树节点
void insertNodeToTree(BTree* bTree,ElemData e);
//遍历 (中序遍历 左根右)
void ergodicTree_LDR(BTree bTree);
//遍历 (先序遍历 根左右)
void ergodicTree_DLR(BTree bTree);
//遍历 (后序遍历 左右根)
void ergodicTree_LRD(BTree bTree);
void destroyTree(BTree bTree);
2.实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tree.h"
#include <time.h>
//创建一个树节点
BTree createNode(){
BTree bTree = (BTree)malloc(sizeof(BinTree));
if(bTree == NULL){
printf("内存分配失败!\n");
return NULL;
}
memset(bTree,0,sizeof(BinTree));
bTree->left = NULL;
bTree->right = NULL;
bTree->parent = NULL;
return bTree;
}
//初始化只有ROOT节点的树
void initTree(BTree* bTree,ElemData e){
BTree bt = createNode();
if(bt == NULL)
return;
bt->data = e;
*bTree = bt;
}
//插入一个树节点
void insertNodeToTree(BTree* bTree,ElemData e){
BTree tree = NULL;
if(*bTree != NULL){
tree = findNode(*bTree,e);
if(tree == NULL){
return;
}
}
if(tree != NULL && tree->data == e){
return;
}
BTree bt = createNode();
if(bt == NULL)
return;
bt->data = e;
if(*bTree == NULL){
*bTree = bt;
return;
}
//插入到左子树节点
if(tree->data > e && tree->left == NULL){
tree->left = bt;
bt->parent = tree;
}
//插入到右子树
else if(tree->data < e && tree->right == NULL){
tree->right = bt;
bt->parent = tree;
}
}
//要插入的位置为一个左子数节点为NULL或者右子树为NULL的地方,所以只需要遍历改二叉树,找到一个为左右子树为空的合适的节点就可以插入
BTree findNode(BTree bTree,ElemData e){
if(bTree == NULL){
return NULL;
}
if(bTree->data > e && bTree->left != NULL){
findNode(bTree->left,e);
}else if( bTree->data < e && bTree->right != NULL){
findNode(bTree->right,e);
}else{
return bTree;
}
}
//遍历 (中序遍历 左根右)
void ergodicTree_LDR(BTree bTree){
if(bTree == NULL)
return;
ergodicTree_LDR(bTree->left);
printf("%d-->",bTree->data);
ergodicTree_LDR(bTree->right);
}
//遍历 (先序遍历 根左右)
void ergodicTree_DLR(BTree bTree){
if(bTree == NULL)
return;
printf("%d-->",bTree->data);
ergodicTree_DLR(bTree->left);
ergodicTree_DLR(bTree->right);
}
//遍历 (后序遍历 左右根)
void ergodicTree_LRD(BTree bTree){
if(bTree == NULL)
return;
ergodicTree_LDR(bTree->left);
ergodicTree_LDR(bTree->right);
printf("%d-->",bTree->data);
}
void destroyTree(BTree bTree);
int main(){
BTree bTree = NULL;
initTree(&bTree,50);
insertNodeToTree(&bTree,100);
insertNodeToTree(&bTree,30);
insertNodeToTree(&bTree,20);
insertNodeToTree(&bTree,31);
insertNodeToTree(&bTree,20);
srand((unsigned) time(NULL));
// for (int i=0; i<100; i++)
// {
// int number = rand() % 10; //产生0-100的随机数
// insertNodeToTree(&bTree,number);
// }
ergodicTree_LDR(bTree);
printf("\n");
return 0;
}