数据结构和算法之美-二叉树(上)

24 篇文章 1 订阅
24 篇文章 3 订阅

学习笔记

  • “树”这种数据结构的形态特征
    包括有哪些命名节点和它们的概念,这些节点是根节点,叶子节点,父节点,子节点,兄弟节点等;以及相关节点关系的建立,这些关系是父子关系和兄弟关系

  • “树"这种数据结构的‘物理’特征
    包括树的高度,深度,层和树的高度及其概念。

  • 几种特殊二叉树的形态特征: 满二叉树,完全二叉树。

  • 树的存储方法
    一种是基于指针或引用的链式存储,另一种是基于数组的顺序存储。

  • 完全二叉树用数组存储以节省内存空间。数组存储算法是:
    根节点存储在数组索引为1的单元,其他节点遵循如下规律-节点i(i>=2)存储在数组索引为i的单元=>它的左子节点存储在数组索引为2i的单元,它的右子节点存储在数组索引为2i+1的单元。
    如果节点i不是叶子节点(也就是说它一定不是在最后两层),那么节点i+1是i的兄弟节点,对于它的兄弟节点i+1而言=>它的左子节点存储在数组索引为2i+2的位置,它的右子节点存储在数组索引为
    2
    i+3的位置,于是就建立了如下连续存储的图示
    |
    i i+1
    2i 2i+1 2i+2 2i+3

  • 二叉树的遍历,包括前序遍历算法,中序遍历算法和后序遍历算法,每个节点最多访问2次,所以时间复杂度是O(n),跟节点数量成正比。
    下面用C代码实现这三种遍历的算法

/*Tree*/
/*!log: [2018/11/4]write the algorithm of pr-order,in-order,post-order to travel through the tree */

#include <stdio.h>

struct kNote{
    int number;
    struct kNote *left;
    struct kNote *right;
};

void preOrder(struct kNote *root)
{
    if(NULL == root)
    {
        return;
    }
    else
    {
        printf("Current number:%d\n", root->number);
        preOrder(root->left);
        preOrder(root->right);
    }
}

void inOrder(struct kNote *root)
{
   if(NULL == root)
    {
        return;
    }
    else
    {
        inOrder(root->left);
        printf("Current number:%d\n", root->number);
        inOrder(root->right);
    }
}

void postOrder(struct kNote *root)
{
   if(NULL == root)
    {
        return;
    }
    else
    {
        postOrder(root->left);
        postOrder(root->right);
        printf("Current number:%d\n", root->number);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值