c语言实现 排序二叉树(码了小半天,中午吃了个火锅,晚上骑了趟太湖,居然一次调通了= =)
来源:互联网 发布:vs2015中开发php 编辑:程序博客网 时间:2024/06/11 21:44
#include<stdlib.h>
#include<stdio.h>
typedef struct node{
struct node *parent;
struct node *left_child;
struct node *right_child;
int data;
}NODE;//节点结构体,也是一片树叶
NODE *result;//全局变量,用于查找树中的某个数据时保存此节点
NODE *make_node(NODE *parent,NODE *left_child,NODE *right_child,int data)//创造一个节点,创造一片叶子
{
NODE *new_node = (NODE *)malloc(sizeof(NODE));
new_node->parent = parent;
new_node->left_child = left_child;
new_node->right_child = right_child;
new_node->data = data;
return new_node;
};
NODE *plant_tree(NODE *root,int data)//种植一棵树
{
root->data = data;
return root;
}
void grow_leaf(NODE *root,int data)//生长一片叶子,即存入一个数据
{
if(root->data > data)//数据小于节点数据,放入左子树
{
if(root->left_child == NULL)
root->left_child = make_node(root,NULL,NULL,data);
else
grow_leaf(root->left_child,data);//递归调用
}
else
{
if(root->right_child == NULL)
root->right_child = make_node(root,NULL,NULL,data);
else
grow_leaf(root->right_child,data);
}
}
void pre_order_travel(NODE *root)//前序遍历,即MLR
{
if(root)
{
printf("data = %d\n",root->data);
pre_order_travel(root->left_child);
pre_order_travel(root->right_child);
}
}
void mid_order_travel(NODE *root)//中序遍历,即LMR,这个可以实现从小到大排序
{
if(root)
{
mid_order_travel(root->left_child);
printf("data = %d\n",root->data);
mid_order_travel(root->right_child);
}
}
void empty_last_result()//清空全局变量里面存的结果,便于下次查找
{
result = NULL;
}
NODE *search_tree(NODE *root,int data)//从树里查找一个数据,返回这个节点,如果要删除,便于删除
{
empty_last_result();
search(root,data);
return result;
}
void search(NODE *root,int data)//递归查询
{
if(root)
{
if(data == root->data)
{
printf("data found in one_leaf\n");
result = root;
}
search(root->left_child,data);
search(root->right_child,data);
}
}
NODE * find_most_right(NODE *leaf)//寻找最右节点,便于删除时用,在剪叶子时候用
{
NODE *most_right;
if(leaf->right_child==NULL)
return leaf;
most_right=find_most_right(leaf->right_child);
return most_right;
}
void cut_leaf(NODE *root,int data)//修剪枝桠,即删除一个数据,要对树做相应处理,有点麻烦,算法看百度百科
{
NODE *one_leaf,*temp_leaf;
if(one_leaf=search_tree(root,data))
{
if(one_leaf->left_child == NULL && one_leaf->right_child == NULL)
{
if(one_leaf==one_leaf->parent->left_child)
one_leaf->parent->left_child = NULL;
else
one_leaf->parent->right_child = NULL;
}
else if(one_leaf->left_child == NULL || one_leaf->right_child == NULL)
{
if(one_leaf->left_child == NULL)
{
if(one_leaf==one_leaf->parent->left_child)
one_leaf->parent->left_child = one_leaf->right_child;
else
one_leaf->parent->right_child = one_leaf->right_child;
}
else
{
if(one_leaf==one_leaf->parent->left_child)
one_leaf->parent->left_child = one_leaf->left_child;
else
one_leaf->parent->right_child = one_leaf->left_child;
}
}
else
{
if(one_leaf==one_leaf->parent->left_child)
one_leaf->parent->left_child = one_leaf->left_child;
else
one_leaf->parent->right_child = one_leaf->left_child;
temp_leaf = find_most_right(one_leaf->left_child);
temp_leaf->right_child = one_leaf->right_child;
}
free(one_leaf);
}
else
printf("no such leaf in this tree");
}
int main(void)//来,测试一下,x86的gcc通过
{
NODE *root,*one_leaf;
root = make_node(NULL,NULL,NULL,0);
plant_tree(root,5);
grow_leaf(root,1);
grow_leaf(root,2);
grow_leaf(root,7);
grow_leaf(root,8);
pre_order_travel(root);
one_leaf=search_tree(root,2);
cut_leaf(root,7);
pre_order_travel(root);
mid_order_travel(root);
return 0;
}
- c语言实现 排序二叉树(码了小半天,中午吃了个火锅,晚上骑了趟太湖,居然一次调通了= =)
- 今晚吃火锅去了
- 中午了
- union 居然排序了
- 忙了半天:)
- 连续熬夜了好几个晚上了
- 第一次用java实现建立二叉树。以前都是C++,居然忘记了
- 一个晚上和半天把C++primer看到了50页
- 被度娘cdn坑了个半天
- 装个驱动装了半天...
- 好长啊,看了半天~~~
- 又浪费了半天
- 郁闷了半天
- 吃了个大西瓜
- 写了半天的C语言,感觉还是太难了,烦请中,
- 花了一个晚上+半天,把红警打穿了 哈哈哈
- 我们科长要结婚了,晚上去吃喜酒!
- 永和油条居然超标了!以后还怎么吃?
- hdoj 3552 —— 思维题
- C指针问题
- ZeroMemory
- IT好地方
- Nim
- c语言实现 排序二叉树(码了小半天,中午吃了个火锅,晚上骑了趟太湖,居然一次调通了= =)
- 图音80系列车载导航/DVD分体机安装DSA
- MVC中使用EF(4):ASP.NET MVC 创建更复杂的数据模型
- 常用的curl发包函数
- 经纬度表示方法及精度
- linux内核--系统调用(四)
- JAVA下的第一个程序
- log4net的配置详解
- 数据库设计三大范式