二叉树的简介
二叉树本身的意义不重要,只学二叉树的话会觉得没什么用,因为他不像栈那样为复杂循环提供了行之有效的解决办法。学习二叉树的目的其实是为了后面的排序树、平衡树、堆等知识做准备。
生成一颗二叉树
生成二叉树的方式大概有两种
第一种是用某种序列+#号(用来代表空指针)
第二种是用中序序列 + 任意一个其他序序列 (前序、后序、层次 ,这种方法不需要用符号去代表空指针)生成
这里写了个函数,输入层次遍历的序列(空用#去代替),生成一个二叉树并且返回根节点。
/*
用例
1234567#8####9#####
1234567########
73914#####5#6##
*/
biTree* initBiTree(char* data)
{
if(NULL == data)
return NULL;
int i = 0;
//生成 数组(树)
for(i;data[i]!='\0';i++);
biTree* arry_tree = (biTree*) malloc (sizeof(biTree) * i); //c语言中的数组和头指针
for(i=0;data[i]!='\0';i++)
{
if(data[i] == '#')
arry_tree[i].data = 0;
else
arry_tree[i].data = data[i] - '0';
}
//操作指针添加关系
int son_pos = 1;
int this_pos = 0;
for(this_pos=0,son_pos=1;son_pos<i;this_pos++,son_pos +=2 )
{
if(arry_tree[this_pos].data == 0)
{
son_pos -= 2;
}
if(arry_tree[son_pos].data != 0)
arry_tree[this_pos].leftSon = &(arry_tree[son_pos]);
else
arry_tree[this_pos].leftSon = NULL;
if(arry_tree[son_pos+1].data != 0)
arry_tree[this_pos].rightSon =&(arry_tree[son_pos+1]);
else
arry_tree[this_pos].rightSon = NULL;
}
return &(arry_tree[0]);
}