数据结构与算法3 树(上)二叉树及存储结构

二叉树及存储结构

在这里插入图片描述

  • 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;//就往右走,在重新从头开始,判断能不能往左走
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值