二叉树是最多有两个孩子节点的类型的树
二叉树的思想延伸有很多,最经典的就是二分查找了,还有就是用决策树来判断比较排序的最优时间复杂度。等等。我就把不一一列举了(囧~当然也列举不完)。
今天用了将近半天的时间把二叉树的很多操作都实现了一下。有些非递归的真的是不好做,也不是很好想,开始做前序非递归我绞尽脑汁~~想了很久也没有想出来,后来大多都是听老师或者百度后才知道原来是这么写的。其实非递归写的真的不多,毕竟c语言短小精悍!但是要真正掌握c的要义以后还是要多多加强练习,希望以后自己可以能够自己想出来做出来。
由于代码比较多,(其实我觉得多,毕竟太多大家也找不到重要的)本文全部写递归思想
下一篇会补上其他的非递归。
闲言少叙,开始正式的代码之旅:
1.建树:这个是方法老师给我们讲的,和之前网上看到的略有不同之处
二叉树是一棵最多只有两个孩子节点类型的树。
很多算法都是可以用二叉树来描述,最经典的莫非二分查找算法了。二叉树还可以用作决策树
//创建节点
static Tree_node *create_node(void)
{
Tree_node *node = (Tree_node *)Malloc(sizeof(Tree_node));
bzero(node,sizeof(Tree_node));//是库函数strings.h(是的你没有看错,后面有s)的函数。作用是把n个数据块清0
return node;
}
//注意使用二级指针,因为如果传*str这个字符串,递归回退的时候参数str指向
//没有变化。只有使用二级指针,使得指向发生变化,才能让它向后移动。
Tree create_tree(const char **str)
{
//根据字符串创建一个二叉树
//a#bc##d##
// a
// \
// b
// / \
// c d
//先让根为NULL,如果不是'#'那么在创建节点并且赋值
Tree root = NULL;
if(**str != '#' && str != NULL && *str != NULL){
root = create_node();
root->ele = **str;
//指针指向字符串的下一个位置,然后创建左子树
++*str;
root->left = create_tree(str);
//如果为'#'就转到这里,创建右子树。
++*str;