#include<stdio.h>
#include<stdlib.h>
typedef struct tree {
int data;
struct tree* left;
struct tree* right;
}Btree,*Link_tree;
Link_tree Nnode(int data) {
Link_tree nnode = (Link_tree)malloc(sizeof(Btree));
if (!nnode) {
printf("申请空间失败无法储存数据!\n");
return NULL;
}
nnode->data = data;
nnode->left = NULL;
nnode->right = NULL;
return nnode;
}
//二叉树的创立
Link_tree create_btree(Link_tree root, int data) {
if (root == NULL) {
return Nnode(data);
}
else {
if (root->data > data) {
root->left = create_btree(root->left,data);
}
else {
root->right = create_btree(root->right,data);
}
return root;
}
}
void pre_traverse(Link_tree ptr) {
if (ptr) {
printf("%d ",ptr->data);
pre_traverse(ptr->left);
pre_traverse(ptr->right);
}
}
void mid_traverse(Link_tree ptr) {
if (ptr) {
mid_traverse(ptr->left);
printf("%d ", ptr->data);
mid_traverse(ptr->right);
}
}
void post_traverse(Link_tree ptr) {
if (ptr) {
post_traverse(ptr->left);
post_traverse(ptr->right);
printf("%d ", ptr->data);
}
}
Link_tree search(Link_tree ptr,int value) {
while (ptr) {
if (ptr->data == value) {
return ptr;
}
else if(ptr->data > value){
ptr = ptr->left;
}
else {
ptr = ptr->right;
}
}
return ptr;
}
int main() {
int data[] = {5,6,24,8,12,3,17,1,9};
Link_tree root = NULL;
int i = 0;
for (i = 0; i < sizeof(data) / sizeof(int);i++) {
root = create_btree(root,data[i]);
}
//前序遍历
printf("前序遍历\n");
pre_traverse(root);
printf("\n");
//中序遍历
printf("中序遍历\n");
mid_traverse(root);
printf("\n");
//后序遍历
printf("后序遍历\n");
post_traverse(root);
//节点查找
int value = 0;
printf("\n");
scanf_s("%d",&value,sizeof(int));
Link_tree ptr = search(root,value);
if (ptr) {
printf("\n找到了[%2d]", value);
}
else {
printf("\n没找到[%2d]",value);
}
//二叉树节点的插入,可以直接调用初始化函数,如果
//为了确保数据不重复那么先进行查找,在没查找到的
//情况下再插入
/*
节点的删除操作
1.叶节点,则指向叶节点的标签置空
2.若非根叶结点操作与单向链表删除
中间节点类似,
3,若删除根节点,左子树不变,右子
树根节点在左子树中重新寻找位置插入
*/
return 0;
}