• 二叉树的基本概念、存储结构和(递归)遍历方式


    二叉树
    度为二的数
    二叉树的子树有左右之分
    特殊二叉树
    1.斜二叉树(类似链表)
    2.完美二叉树(满二叉树)(每个结点都有里两个儿子,除了最底下的结点的叶节点没有儿子
    3.完全二叉树:从上往下,从左往右编号,与满二叉树必须完全一致只能少最后面的几个结点,不能有空缺

    二叉树的几个重要性质
    1.一个二叉树第i层的最大结点数为2^(i-1)
    2.深度为K的二叉树有最大结点总数为2^k - 1
    3.对任何非空二叉树,若n0表示叶节点的个数,n1表示度为1的结点个数n2表示度为2的结点个数,那么存在这样的关系:n0 = n2 + 1;
    总的节点数 n0 + n1 + n2
    边的数量 n0 + n1 + n2 - 1 = 0*n0 + 1*n1 + n2 * 2 ----> n0 = n2 + 1

    二叉树的抽象数据类型定义
    数据对象集:一个有穷的结点集合
    若不为空,则由根节点和其左、右二叉子树组成
    操作集:
    1.判断二叉树是否为空:Boolean IsEmpty(BinTree BT)
    2.遍历、按某顺序访问每个结点:void Traversal(BinTree BT)
    3.创建一个二叉树:BinTree CreatBinTree()

    常见的遍历方法:
    void PreOrderTraversal(BinTree BT):先序---根、左子树、右子树
    void InOrderTraversal(BinTree BT):中序---左子树、根、右子树
    void PostOrderTraversal(BinTree BT):后序---左子树、右子树、根
    void LevelOrderTraversal(BinTree BT):层次遍历,从上到下,从左到右

    二叉树的存储结构:
    1.顺序存储结构(数组)
    完全二叉树: 按从上至下、从左到右顺序存储
    n个结点的完全二叉树的结点父子关系
    1.非根节点(序号i > 1)的父节点的序号是int(i / 2)
    2.结点(序号为i)的左孩子及诶那的序号是2i(2i <= n,否则没有左孩子)
    3.结点(序号为i)的右孩子结点的序号是2i+1(2i+1 <= n,否则没有右孩子)

    结点 A B O C S M Q W K
    序 号 1 2 3 4 5 6 7 8 9


    一般二叉树也可以采用这种结构,但会造成空间浪费
    结点 A B O ∧ ∧ M ∧ ∧ ∧ ∧ ∧ ∧ C
    序 号 1 2 3 4 5 6 7 8 9 10 11 12 13

    2.链表存储

    typedef struct TreeNode *BinTree;
    typedef struct BinTree Position;
    struct TreeNode {
        ElementType Element;
        BinTree Left;
        BinTree Right;
    }

    二叉树的遍历
    1.先序遍历:
    遍历顺序:A B D F E C G H I
    1.访问根节点
    2.先序遍历其左子树
    3.先序遍历其右子树

    1 void PreOrderTraversal(BinTree BT)
    2 {
    3     if(BT)
    4     {
    5         printf("%d", BT->data);
    6         PreOrderTraversal(BT->Left);
    7         PreOrderTraversal(BT->Right);
    8     }
    9 }

    2.中序遍历
    遍历过程:D B E F A G H C I
    (1)中序遍历其左子树
    (2)访问根节点
    (3)中序遍历其右子树

    1 void PreOrderTraversal(BinTree BT)
    2 {
    3   if(BT)
    4   {
    5     PreOrderTraversal(BT->Left);
    6     printf("%d", BT->data);
    7     PreOrderTraversal(BT->Right);
    8   }
    9 }

    3.后序遍历
    遍历过程: D E F B H G I C A
    (1)后序遍历其左子树
    (2)后序遍历其右子树
    (3)访问根节点

    1 void PreOrderTraversal(BinTree BT)
    2 {
    3   if(BT)
    4   {
    5     PreOrderTraversal(BT->Left);
    6     PreOrderTraversal(BT->Right);
    7     printf("%d", BT->data);
    8   }
    9 }

    先序、中序和后序遍历过程:遍历过程中经过结点的路线都是一样,只是访问各节点的时机不同
    图中在从入口到出口的曲线上用 三种符号分别标
    记出了 先序、中序和后序刻 访问各结点的时刻

     

  • 相关阅读:
    Lifegame第一阶段任务
    软件工程 第一次实验 Git代码版本管理
    个人作业——软件工程实践总结&个人技术博客
    个人技术总结-Android hellocharts折线图
    结对第二次作业——某次疫情统计可视化的实现
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    第六次作业
    第五次作业
    第四次作业
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/9513045.html
Copyright © 2020-2023  润新知