二叉树
二叉树
树的任意节点的子节点不超过2个,而且区分左右(有序树),这样的树称为二叉数。
二叉树在内存中的储存
- 顺序储存
用储存位置表示节点之间的逻辑关系
第i个节点的左子节点对应对应的序号为:2i。
第i个节点的右子节点对应对应的序号为:2i + 1 。
- 链式储存
用左孩子指针和右孩子指针表示节点之间的逻辑关系
节点设计:
struct node{
char data; //数据域
//指针域
struct node * plchild; //左孩子指针
struct node * prchild; //右孩子指针
};
(1) 创建二叉树
参考先序遍历,第一步先对根节点进行操作,再遍历左节点,后遍历右节点。
bool create_btree(struct node ** proot){ //*proot是指针变量,指向根节点
char ch; //根节点所存放的数据
scanf("%c", &ch); //从键盘输入到缓存中,每次只拿一个字符
//操作根节点
if(ch == '*'){
*proot = NULL; //如果从缓存中得到的是'*',不创建节点
}
if(ch != '*'){
*proot = malloc(sizeof(struct node)); //创建节点
if(*proot == NULL)
return false;
(*proot)->data = ch; //写入数据
}
//遍历左子树
create_btree(&((*proot)->plchild)); //&((*proot)->plchild)获取结构体中左子树指针变量的地址
//遍历右子树
create_btree(&((*proot)->prchild)); //&((*proot)->prchild)获取结构体中右子树指针变量的地址
return true;
}
(2)遍历二叉树
先序遍历:先访问根节点,再先序遍历左子树,最后先序遍历右子树;
中序遍历:先中序遍历左子树,再访问根节点,最后中序遍历右子树;
后续遍历:先后序遍历左子树,再后序遍历右子树,最后访问根节点;
按层遍历:从上到下,从做到右,算法:
将头节点的地址入队
while(队列不为空){
出队首节点
将左节点的地址入队
将右节点的地址入队
}
学习笔记,欢迎纠错