数据结构-树与二叉树

一、树的定义与性质

<1>定义
  1. 结点(node):树枝分叉处、树叶、树根
  2. 根结点(root):树根
  3. 叶子结点(leaf):叶子结点
  4. 边(edge):茎干和树枝
  5. 子结点(child)
  6. 子树(subtree)
<2>性质
  1. 树可以没有结点,把这种情况下称为空树(empty tree)
  2. 树的层次(layer),从根结点开始算起来,即根结点为第一层
  3. 把结点的子树棵树称为结点的度(degree),而树的中结点的最大的度称为树的度(也称为树的宽度)
  4. 对于有n个结点的树的边一定是n-1
  5. 叶子结点被定义为0的结点,因此当树只有一个结点时,根结点也算作叶子结点
  6. 结点的深度(depth)是指从根结点(深度为1),开始自顶向下逐层累加至该结点时的深度值;而高度(height)是指从最底层叶子结点开始自底向上逐层累加,而对于树而言,是选择最大的那个数,同时,深度和高度应该是一样的。
  7. 多棵树结合在一起就是森林(forest)
<3>二叉树的递归定义
  1. 要么二叉树没有根结点,是一棵空树。
  2. 要么二叉树由根结点、左子树、右子树组成,且左子树和有子树都是二叉树。
  • 区分二叉树和度为2的树
  • 满二叉树:每一层结点个数都达到当层能够达到的最大结点数。
  • 完全二叉树:除了最下面一层之外,其余层的结点个数都达到当层的最大结点数,且最下面一层只从左到右连续存在若干结点,而这些连续结点右边的结点全部不存在。
  • 自己即是自己的祖先结点,也是自己的子孙结点。
<4>二叉树的存储结构
//二叉链表
struct node{
    typename data;
    node* lchild;
    node* rchild;
};

//如果二叉树在建树前根结点不存在,因此其地址一般设为NULL
node* root = NULL;

//如果想要新建结点,可以使用一下函数
node* newNode(int v){
    node* Node = new node;
    Node->data = v;//结点权值
    Node->lchild = Node->rchild = NULL;//初始状态下没有左右孩子
    return Node;//返回新建结点的地址
}
<5>二叉树结点的查找、修改
  • 查找是指在给定数据域的条件下,在二叉树中找到所有数据域为给定数据域的结点,并将它们的数据域修改为给定的数据域。
void search(node* root, int x, int newdata){
    if(root == NULL){
        return;//递归边界
    }
    if(root->data == x){
        root->data = newdata;
    }
    search(root->lchild, x, newdata);
    search(root->rchild, x, newdata);
}
<6>二叉树结点的插入
  • insert函数将在二叉树中插入一个数据域为x的新结点
  • 如何判断是否需要加引用?如果函数中需要新建结点,即对二叉树的结构做出修改,就需要加引用;如果只是修改当前已有结点的内容,或仅仅是遍历树,就不需要加引用。
  • 新建结点之后,务必令新结点的左右指针域为NULL。
void insert(node* &root, int x){
    if(root == NULL){//递归边界
        root = newNode(x);
        return;
    }
    if(由二叉树的性质,x应该插在左子树){
        insert(root->lchild, x);
    }else{
        insert(root->rchild, x);
    }
}
<7>二叉树的创建
node* Create(int data[], int n){
    node* root = NULL;
    for(int i = 0; i < n; i++){
        insert(root, data[i]);
    }
    return root;
}
<8>完全二叉树的存储结构
  1. 对于完全二叉树当中的任何一个结点,其左孩子的编号一定是2x,而右孩子编号一定是2x+1
  2. 1号位存放的必须是根结点
  3. 该数组中元素存放的顺序恰好为该完全二叉树的层序遍历序列
  4. 判断某个结点是否为叶结点的标志为,该结点(记结点下标为root)的左子结点编号root*2大于结点总个数n
  5. 某个结点是否为空结点的标志为该结点下标root大于结点总个数n

原文地址:https://www.cnblogs.com/tsruixi/p/12307459.html

时间: 2024-07-29 07:28:10

数据结构-树与二叉树的相关文章

数据结构---树、二叉树、森林

1.基本术语: 度:有两种度"结点的度"与"树的度".结点的度指的是一个结点子树的个数:树的度是指树中结点度的最大值. 叶子结点:指的是没有子树的结点. 层:树是有层次的,一般根结点为第0层.规定根结点到某结点的路径长度为该结点的层数. 深度:树中结点的最大层数 兄弟:同一双亲的结点,互为兄弟 堂兄弟:双亲在同一层次的结点,互为堂兄弟 祖先:从根结点到该结点的路径上的所有结点都是该结点的祖先. 子孙:以某一结点为根的子树上的所有结点都是该结点的子孙 森林:n棵互不相

数据结构--树,二叉树

树和二叉树用来表示数据之间一对多的关系,而线性表,栈,队列都是线性的数据结构,用来表示一对一的关系. 树只有一个根节点,根也有子节点,子节点又对应多个或者一个子节点. 根节点没有父节点. 同一个节点有可能既是父节点,又是子节点. 普通节点含有子节点,叶子界面没有子节点. 节点:树的基本单位. 节点的度:节点子树的个数. 树的度:所有节点的度的最大值. 叶子节点,无子节点的节点,即度为0的节点. 分支节点,有子节点的节点为分支节点. 节点层次,根节点1,以此类推. 输的深度:节点最大层次. 有序树

浅谈数据结构-树和二叉树之间关系

树都可用二叉链表作为存储结构,对比各自的结点结构可以看出,以二叉链表作为媒介可以导出树和二叉树之间的一个对应关系. ◆ 从物理结构来看,树和二叉树的二叉链表是相同的,只是对指针的逻辑解释不同而已. ◆ 从树的二叉链表表示的定义可知,任何一棵和树对应的二叉树,其右子树一定为空. 1 树转换成二叉树 对于一般的树,可以方便地转换成一棵唯一的二叉树与之对应.将树转换成二叉树在"孩子兄弟表示法"中已给出,其详细步骤是: ⑴ 加虚线.在所有兄弟结点之间加线. ⑵ 去连线.只保留大孩子(除最左的第

数据结构 -树和二叉树

树的主要内容 树型结构:非线性结构,以分支关系定义的层次结构. 主要内容: 树和二叉树的概念.性质 二叉树的存储 二叉树的遍历 线索二叉树 树与二叉树的转化 Huffman树(最优树) 树的定义 树(Tree)是n(n≧0)个结点的有限集合T,若n=0时称为空树,否则: ⑴ 有且只有一个特殊的称为树的根(Root)结点: ⑵ 若n>1时,其余的结点被分为m(m>0)个互不相交的子集 T1, T2, T3-Tm,其中每个子集本身又是一棵树,称其为根的子树(Subtree). 这是树的递归定义,即

C#数据结构—树和二叉树

线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系.树形结构在现实世界中广泛存在,如家族的家谱.一个单位的行政机构组织等都可以用树形结构来形象地表示.树形结构在计算机领域中也有着非常广泛的应用,如 Windows 操作系统中对磁盘文件的管理.编译程序中对源程序的语法结构的表示等都采用树形结构.在数据库系统中,树形结构也是数据的重要组织形式之一.树形结构有树和二叉树两种,树的操作实现比较复杂,但树可以转换为二叉树进行处理

数据结构—树(二叉树)

#define _CRT_SECURE_NO_WARNINGS 1 //树:非线性的数据结构,由有限个节点组成一个具有层次关系的集合.像是一颗倒挂的树,所以叫树. //树的相关概念: //1.节点的度:一个节点含有的子树的个数成为节点的度 //2.叶节点(终端节点):度为0的节点称为终端节点,(子节点为空的节点) //3.非终端节点(分支节点):度不为0的节点,即(子节点不为空的节点) //4.双亲节点(父节点):若一个节点含有子节点,称该节点为子节点的父节点 //5.孩子节点(子节点):一个节

python数据结构树和二叉树简介

一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树的递归定义:树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:(1)有且仅有一个特定的称为根(Root)的结点:(2)其余的结点可分为m(m≥0)个互不相交的子集Tl,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subree). 二.二叉树的定义 二叉树是由n(n≥0)个结点组成的有限集合.每个结点最多有两个子树的有序树

数据结构----树、二叉树----c++ &amp;&amp; python

树结构,尤其是二叉树结构是算法中常遇见的,这里根据学习过程做一个总结. 二叉树所涉及到的知识点有:满二叉树与完全二叉树.节点数目的关系.节点数与二叉树高度的关系.层次遍历.深度优先遍历.广度优先遍历等等. 这里对二叉树的基本结构实现c++版本以及python版本的代码,并且实现二叉树的前中后序遍历过程以及前中.中后序列创建唯一二叉树的过程. 1.C++版本实现 基本结构: http://www.cnblogs.com/elleniou/archive/2012/05/03/2480042.htm

数据结构学习笔记(树、二叉树)

树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 对于树的定义还需要强调两点:1.n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点.2.m>0时,子树的个数没有限制,但它们一定是互不相交的. 结点