浅谈【数据结构】树与二叉树一

目录

1、树与二叉树

1.1树的概念

2、二叉树

2.1二叉树的五大形态

2.2二叉树的性质

2.3二叉树的存储结构

2.4二叉树的遍历


谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注

没错,说的就是你,不用再怀疑!!!

希望我的文章内容能对你有帮助,一起努力吧!!!


1、树与二叉树

1.1树的概念

树(tree)是n(n>=0)个结点的有限集,在任意一棵非空树中

  • 有且仅有一个特点的结点称为(root)根结点
  • 当n>1的时候,其余结点可以分为m(m>0)个互不相交有限集:T1、T2、T3...Tm。其中每一个有 限集,又可以看成是一棵树,并且称之为根的子树

树结点包含一个数据元素以及若干个指向其子树的分支(指针)

结点层次

结点层次:从根开始定义的,根结点为第一层、根的子结点(孩子)为第二层、....、树中结点的最大的 层次称为:树的高度(height)或者说是树的深度(depth)

结点的度

结点的度:结点拥有的子树的数量:度。度为0的结点称为:叶子结点(leaf)或者是终端结点、度不为0 的结点:分支结点

代码示例:

#include <iostream>

// 用来记录树子结点信息的结点
typedef struct node_infor
{
    int index;
    struct node_infor *next;
}Infor;

// 树的结点
typedef struct tree_node
{
    int value;
    Infor *tree_node_ptr;
}TreeNode;


void addNode(TreeNode *tree,Infor *node)
{
    Infor *node_ptr =  tree->tree_node_ptr;

    if(node_ptr == nullptr)
    {
        tree->tree_node_ptr = node;
        return ;
    }

    // 找到下一个为空的位置
    while(node_ptr->next)node_ptr = node_ptr->next;

    // 尾插法
    node_ptr->next = node;
}

void frontPrint(TreeNode *tree,int index)
{
    std::cout << tree[index].value << " ";

    Infor *node_ptr = tree[index].tree_node_ptr;
    while(node_ptr)
    {
        frontPrint(tree,node_ptr->index);
        node_ptr = node_ptr->next;
    }
    
}

int main()
{
    // 创建一棵树
    TreeNode tree[10];

    // 初始化树的结点
    for(int i = 0;i < 10;i++)
    {
        tree[i].value = i+1;
        tree[i].tree_node_ptr=nullptr;
    }

    // 设置关系
    Infor *node = new Infor;
    node->index = 1;
    node->next = nullptr;
    addNode(&tree[0],node);

    node = new Infor;
    node->index = 2;
    node->next = nullptr;
    addNode(&tree[0],node);

    node = new Infor;
    node->index = 3;
    node->next = nullptr;
    addNode(&tree[0],node);

    node = new Infor;
    node->index = 4;
    node->next = nullptr;
    addNode(&tree[1],node);

    node = new Infor;
    node->index = 5;
    node->next = nullptr;
    addNode(&tree[2],node);

    node = new Infor;
    node->index = 6;
    node->next = nullptr;
    addNode(&tree[2],node);

    node = new Infor;
    node->index = 7;
    node->next = nullptr;
    addNode(&tree[2],node);

    node = new Infor;
    node->index = 8;
    node->next = nullptr;
    addNode(&tree[3],node);

    node = new Infor;
    node->index = 9;
    node->next = nullptr;
    addNode(&tree[3],node);


    frontPrint(tree,0);
    std::cout << std::endl;
}

2、二叉树

二叉树是一种树的形状结构

它的特点:

  • 它的每一个结点最多最多只能有两个子树,也就是说二叉树它不能存在度大于2的结点
  • 二叉树的子树称为:左子树、右子树。注意:子树的次序不能颠倒

2.1二叉树的五大形态

  • 空二叉树
  • 只有一个根结点的二叉树
  • 只有一个左子树的二叉树
  • 只有一个右子树的二叉树
  • 左右子树都存在的二叉树(完全二叉树)

2.2二叉树的性质

在二叉树的第i层上至多有2^(i-1)个结点(i>=1)

  • 在任何一棵二叉树下,如果其终端结点(叶子结点)个数为n0,度为2的结点树为n2,则有n2=n0-1
    • 满二叉树:
      • 一棵深度为k具有2^k-1个结点的二叉树(在不改变二叉树的深度情况下,不能增加新的 结点的二叉树)
    • 完全二叉树:
      • 除去最后一层之后,就是一棵满二叉树
      • 最后一层结点必须要是从左至右排列
  • 具有n个结点的完全二叉树,如果自上而下,自左到右,从1到n进行编号,那么变好的为i的结点, 它的左结点(如果存在)那么比编号为:2i、右结点(如果存在)那么编号:2i+1,它的父结点编 号:i/2

具有n个结点完全二叉树的深度为(log2N)+1向下取整

2.3二叉树的存储结构

  • 顺序存储结构
    • 数组
  • 链式存储结构

2.4二叉树的遍历

如何按照某条搜索路径去访问树里面的每一个结点,使得每一个结点均被访问一次,而且只能访问一 次,”访问“的含义很广,可以是对数据进行打印,修改,对比...

  • 先序访问
    • 先访问根结点,再访问左子树,最后访问右子树(根左右
  • 中序访问
    • 先访问左子树,再访问根结点,最后访问右子树(左根右
  • 后序访问
    • 先访问左子树,再访问右子树,最后访问根结点(左右根
  • 注意:先中后序访问需要把左右子树都作为一棵正常的树来看待
  • 先序,中序,后序是针对于来说的,就是围绕根结点(把当前结点看做根结点使用),若左和右 不是终端结点,则会继续深入(递归)遍历,但是每次访问的结点都会当做根结点使用。
  • 层次遍历:
    • 一层一层的去遍历元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值