3.10 基础学习:树、二叉树

Chapter3: 更好的查找与排序算法

10. 基础学习:树、二叉树

用数组来表示一棵树

结构分为逻辑结构和物理结构(或存储结构)

存储结构只有两种:顺序存储和和链式存储

用数组来表示1棵树,可以按照从上到下,从左到右的顺序给树编号,这样结点i 的左子结点下标为 2i+1 , 右子结点下标为 2i+2 ,如果其范围超出了数组长度,说明它没有对应的子结点;其父结点为 [(i-1)/2] (实际上整数除法也是下取整) 。

树的遍历方式

树的遍历方式有:

  • 先序遍历(根,左子树,右字数)

    从整棵树的根节点开始,遍历完根节点的整棵左子树再遍历其右子树,对于每一个子树而言顺序也是如此(根、左子树,右子树)。其实就是一个递归

  • 中序遍 历(左子树,根,右子树)

  • 后序遍历(左子树,右子树,根)

"序" 可以理解为 "跟","先序"即 "先跟","中序"即"中根","后序"即"后根"。

如对于下面这棵树:

  • 先序 : 78,56,43,2,23,4,34,1,14

  • 中序:2,43,23,56,4,78,1,34,15

  • 后序 :2,23,43,4,56,1,15,34,78

7346071-46f0f651d42ba633.png
一棵二叉树

树的遍历方式的代码

先序遍历
/*递归形式的中序遍历
参数:输入数组,数组长度,当前访问子树根结点索引*/
void inOrder(int*arr,int arrLen,int i){
    if(i>arrLen)
        return;
    printf("%d",arr[i]);//根结点
    preOder(arr,arrLen,arr[i*2+1]);//左子树
    preOrder(arr,arrLen,arr[i*2+2]);//右子树
}
中序遍历
/*递归形式的中序遍历
参数:输入数组,数组长度,当前访问子树根结点索引*/
void preOrder(int*arr,int arrLen,int i){
    if(i>arrLen)
        return;
    printf("%d",arr[i*2+1]);//左子树
    preOder(arr,arrLen,arr[i]);//根结点
    preOrder(arr,arrLen,arr[i*2+2]);//右子树
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值