二叉树及存储结构
- a为空,二叉树的子树有左右之分,而一般度为2的树的子树没有左右之分
一棵度为2的树与与一棵二叉树有什么区别:
特殊二叉树
A
B
- A属于完全二叉树,B不属于完全二叉树
二叉树的性质:
二叉树的定义及操作
顺序存储
- 自上向下,自左向右进行编号存在数组中
链表存储
二叉树的遍历
- 递归思想
应用:
dbaec
-
一个有趣的规律:无论是先序,中序,后序遍历,走的路径顺序都是一样的,关键在于结点被访问出来的顺序不一样,且每个结点都会被碰到三次,先序是指第一次碰到结点时就将它访问出来,中序是指第二次,后序是指最后一次,对于叶节点,它三次被碰到都可以看做是被重合到一次了
-
非递归思想采取堆栈的形式
-
while树不空或者堆栈不空时进入下一个while,当树不空时,首先把根节点推入栈,向左子树走,左子树的根结点推入栈,反复操作直到不存在左子树(为NULL)时,跳出while,执行if,如果栈不空,弹出并访问结点,向右子树走,接下来重复执行while(T)…
//堆栈实现后序遍历的非递归程序
void PostOrder(BinTree BT)
{
BinTree T = BT;
stack S = createstack();
while(T || !IsEmpty(S)){
while(T){
push(S, T); //一直往左走
T = T->left;
}
if(top(S)->right != NULL){//往左走到尽头后,看一下能不能往右走,可以的就往右走一步
T = top(S)->right;
continue;//从头开始,判断能不能继续往左走
}
T = pop(S);//如果既不能往左也不能往右,就弹出并访问它
printf("]", T->data);
while(top(S)->right == T){//弹出后,top(S)成为新的堆栈顶部,判断该顶部结点的右结点是不是被弹出的那个结点,如果是,说明该顶部结点也没有右结点了,只能把该顶部结点弹出并访问它,直到该顶部结点存在右结点
T = pop(S);
printf("]", T->data);
}
T = top(S)->right;//就往右走,在重新从头开始,判断能不能往左走
}