树与二叉树的基本概念

树的基本概念

  • 节点:节点包括一个数据元素及若干指向其他子树的分支。
  • 节点的度:节点所拥有子树的个数称为节点的度。
  • 叶节点:度为0的节点成为叶结点,叶结点也称为终端节点。
  • 分支节点:度不为0的节点称为分支节点,分支节点又称非终端节点。一棵树中排除叶结点外的所有节点都是分支节点。
  • 祖先节点:从根节点到该节点所经分支上的所有节点。
  • 子孙节点:以某节点为根节点的子树中所有节点
  • 双亲节点:树中某节点有孩子节点,则这个节点称为它孩子节点的双亲节点,双亲节点也成为前驱节点。
  • 孩子节点:树中一个节点的子树的根节点称为该节点的孩子节点,孩子节点也称为后继节点。
  • 兄弟节点:具有相同双亲节点的节点称为兄弟节点。
  • 树的度:树中所有节点的度的最大值成为该树的度。
  • 节点的层次:从根节点到树中某节点所经路径上的分支也称为该节点的层次,根节点的层次为1,其他节点层次是双亲节点层次加1.
  • 树的深度:树中所有节点的层次的最大值称为该树的深度。

树的存储结构

双亲表示法,孩子表示法,双亲孩子表示法,孩子兄弟表示法。

  • 双亲表示法:用指针表示出每个节点的双亲节点
typedef int DataType;
struct Node{
    struct Node* Parent;//指向双亲节点指针域
    DataType data;//节点中的数据
};

优点:寻找一个节点得双亲节点操作实现很方便
缺点:寻找一个节点的孩子节点很不方便。

  • 孩子表示法: 用指针指出每个节点的孩子节点
typedef int DataType;
struct Node{
    struct Node* Child1;
    struct Node* Child2;
    struct Node* Child3;
    DataType data;
};

优点:寻找一个节点的孩子节点比较方便。
缺点:寻找一个节点得双亲节点很不方便。

  • 双亲孩子表示法:用指针既表示出每个节点得双亲节点,也表示出每个节点的孩子节点。即双亲表示法+孩子表示法。
typedef int DataType;
struct Node{
    struct Node* Parent;
    struct Node* Child1;
    struct Node* Child2;
    struct Node* Child3;
    DataType data;
};

优点:找某个节点的双亲节点和孩子节点非常方便
- 孩子兄弟表示法:即表示出每个节点的第一个孩子节点,也表示出每个节点的下一个兄弟节点。

typedef int DataType;
struct Node{    
    struct Node* Child1;//第一个孩子节点
    struct Node* NextBrother;//指向其下一个兄弟节点
    DataType data;//节点中的数据域
};

二叉树

一棵二叉树是节点的一个有限集合,该集合或者为空,或者是由一个根节点加上两颗分别称为左子树和右子树的二叉树组成。每棵子树的根节点有且只有一个前驱,可以由0个或多个后继。因此,树是递归定义的。

每个节点最多有两棵子树,即二叉树不存在度大于2的节点。二叉树的子树有左右之分,其子树的次序不能颠倒。

  • 满二叉树:在一棵二叉树中,如果所有分支节点都存在左子树和右子树,而且所有叶子节点都在同一层上。
  • 完全二叉树:如果一棵具有N个节点的二叉树的结构与满二叉树的前N个节点的结构相同,称为完全二叉树。满二叉树是特殊的完全二叉树。

树的存储结构

  • 顺序存储结构:对于一棵完全二叉树所有节点按照层序自顶向下,同一层自左向右顺序编号,就得到一个节点的顺序序列。

优点:存储完全二叉树,简单省空间
缺点:存储一般二叉树尤其单支树,存储空间利用不高。

  • 链式存储:
struct BinTreeNode{
    struct BinTreeNode* LChild;//当前节点左子树
    struct BinTreeNode* RChild;//当前节点右子树
    DataType data;//当前节点值域
};
struct BinTreeNode{
    struct BinTreeNode* Parent;//当前节点的双亲
    struct BinTreeNode* LChild;//当前节点左子树
    struct BinTreeNode* RChild;//当前节点右子树
    DataType data;//当前节点值域
};

二叉树的基本操作

二叉树的遍历:遵循某种次序,遍历二叉树中的所有节点,使得每个节点被访问一次,而且仅访问一次。“访问”:即对节点施行某些操作。

  • 先序遍历:先访问根节点,再访问左子树,最后访问右子树。
  • 中序遍历:先访问左子树,再访问根节点,最后访问右子树。
  • 后序遍历:先访问左子树,再访问右子树,最后访问根节点。
  • 层序遍历:同一层中按左子树再右子树的次序遍历,从根节点层到叶节点层访问。
    这里写图片描述

树的拷贝
首先,拷贝分两种:浅拷贝和深拷贝
浅拷贝:两个对象同时指向同一块内存,修改一个,另一个也会被修改。
这里写图片描述
深拷贝:原有所有对象,包括内存复制一份。
这里写图片描述
fork中的拷贝是特殊的拷贝,刚开始时浅拷贝,这样减少了空间浪费。要修改时的一瞬间,再深拷贝。而树的拷贝为深拷贝。

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值