二叉树的遍历:
前序:根 左 右
中序:左 根 右
后序:左 右 根
注意:前中后由根节点决定,并且左右子树的次序不能改变
注意:根据前序+中序 或者 后序+中序 可以还原出一棵树,但是前序+后序是无法还原的
层序遍历:从上到下,从左到右来遍历一棵树,必须配合队列使用
前序
// 前序
void _dlr_show(BinTree* tree,size_t index)
{
// index 是节点的编号,index-1是节点的下标
if(index-1 >= tree->cal || EMPTY == tree->arr[index-1])
return;
printf("%c ",tree->arr[index-1]);
_dlr_show(tree,index*2);
_dlr_show(tree,index*2+1);
}
// 前序
void dlr_show(BinTree* tree)
{
_dlr_show(tree,1);
printf("\n");
}
中序
// 中序
void _ldr_show(BinTree* tree,size_t index)
{
// index 是节点的编号,index-1是节点的下标
if(index-1 >= tree->cal || EMPTY == tree->arr[index-1])
return;
_ldr_show(tree,index*2);
printf("%c ",tree->arr[index-1]);
_ldr_show(tree,index*2+1);
}
// 中序
void ldr_show(BinTree* tree)
{
_ldr_show(tree,1);
printf("\n");
}
后序
void _lrd_show(BinTree* tree,size_t index)
{
// index 是节点的编号,index-1是节点的下标
if(index-1 >= tree->cal || EMPTY == tree->arr[index-1])
return;
_lrd_show(tree,index*2);
_lrd_show(tree,index*2+1);
printf("%c ",tree->arr[index-1]);
}
// 后序
void lrd_show(BinTree* tree)
{
_lrd_show(tree,1);
printf("\n");
}
层序
// 层序
void layer_show(BinTree* tree)
{
// 创建队列
ListQueue* queue = create_list_queue();
push_list_queue(queue,1);
while(!empty_list_queue(queue))
{
int index = head_list_queue(queue);
pop_list_queue(queue);
printf("%c "tree->arr[index-1]);
// 计算出左子树编号,检查并入队
int letf = index*2;
if(letf-1 < tree->cal && EMPTY != tree->arr[left-1])
push_list_queue(queue,left);
// 计算出右子树编号,检查并入队
int right = index*2+1;
if(right-1 < tree->cal && EMPTY != tree->arr[right-1])
push_list_queue(queue,right);
}
printf("\n");
destory_list_queue(queue);
}