首页 > 其他分享 >浅谈【数据结构】树与二叉树一

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

时间:2024-08-25 17:57:18浏览次数:11  
标签:node 结点 Infor 浅谈 tree next 二叉树 数据结构

目录

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二叉树的遍历

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

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

标签:node,结点,Infor,浅谈,tree,next,二叉树,数据结构
From: https://blog.csdn.net/weixin_67526434/article/details/141531195

相关文章

  • 浅谈【数据结构】树与二叉树二
    目录1、二叉排序树1.1二叉树排序树插入1.1.1两种插入方法1.1.2循环法1.1.3递归法1.2二叉树的打印1.3二叉树的结点删除1.4销毁二叉树1.5层次打印谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注没错,说的就是你,不用再怀疑!!!希望我的文章内容能对你有帮助,一......
  • 数据结构:189(轮转数组)leetcode(OJ)
    给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]示例 2:输入:n......
  • Java行为型设计模式-访问者模式(含二叉树场景示例)
    1.访问者模式简介访问者模式(VisitorPattern)是一种行为型设计模式,其主要目的是将数据结构与数据操作解耦。用于将数据结构和在数据结构上的操作分离开来。‌这种模式允许在不修改数据结构的情况下,定义新的操作。2.访问者模式角色访问者模式的主要角色包括:2.1抽象访问......
  • 浅谈二分图
    定义二分图,又称二部图,英文名叫Bipartitegraph。二分图是什么?节点由两个集合组成,且两个集合内部没有边的图。换言之,存在一种方案,将节点划分成满足以上性质的两个集合。性质如果两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色点和一个白......
  • 秋招力扣Hot100刷题总结——二叉树
    二叉树相关的题目基本上都会使用递归,因此做二叉树的题目时首先使用递归,明确递归结束的条件。1.二叉树的层序遍历题目链接题目要求:给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。代码及思路使用队列存储每一层的节点,左边节点先......
  • 集合及数据结构第九节————树和二叉树
    系列文章目录集合及数据结构第九节————树和二叉树树和二叉树树型结构的概念树的概念树的表示形式(了解)树的应用二叉树的概念两种特殊的二叉树二叉树的性质二叉树的性质练习二叉树的存储二叉树的遍历二叉树的基本操作二叉树相关练习题文章目录系列文章目录集合及......
  • 浅谈一类第 k 大问题
    浅谈一类第k大问题IntroductiontoK-thLargestProblems本文介绍一类第k大问题的处理方法。LuoguP1631序列合并LuoguP2048[NOI2010]超级钢琴LuoguP5283[十二省联考2019]异或粽子CodeForces241BFriends基本思想:先找到部分答案,通过这部分答案更新可能的......
  • 软考-软件设计师(数据结构习题一)
       ......
  • 数据结构和算法学习日志-第十章:树
    第十章树思维导图:1.树的定义和树的存储结构1.1树的定义1.1.1定义树(Tree)是n(n>=0)个节点的有限集。当n=0时称为空树。在任意一棵非空树中:有且仅有一个特定的被称为根(Root)的节点当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1、T2、……、Tm,其中每个集合本身又是一棵树,并......
  • 二叉树刷题(1)
    二叉树题目讲解(1)一、构建二叉树并且遍历(1)思路(2)代码二、对称二叉树1、思路2、代码三、相同的树1、思路2、代码四、单值二叉树1、思路2、代码五、另一棵树的子树1、思路2、代码一、构建二叉树并且遍历题目描述:编一个程序,读入用户输入的一串先序遍历字符串,根据此字......