二叉树【java】

一、基本术语

  1. 节点(Node):树中的每个元素称为节点,每个节点包含数据和指向其子节点的链接。
  2. 根节点(Root):树的顶部节点称为根节点,它没有父节点。
  3. 子节点(Child):一个节点的直接下级节点称为子节点。
  4. 父节点(Parent):一个节点的直接上级节点称为父节点。
  5. 叶节点(Leaf):没有子节点的节点称为叶节点或终端节点。
  6. 兄弟节点(Sibling):具有相同父节点的节点称为兄弟节点。
  7. 深度(Depth):从根节点到某个节点的路径上经过的边的数量,也可以理解为该节点所在的层级。
  8. 高度(Height):从某个节点到其最远叶节点的路径上经过的边的数量,也可以理解为该节点所在子树的最大深度。

二、二叉树的认识

2.1  概念

        二叉树(Binary Tree)是一种常见的树形结构,它由节点(Node)和节点之间的关系构成。每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树中的每个节点可以为空(null)。

2.2  性质

  1. 每个节点最多只有两个节点:左子节点和右子节点,节点的度数(Degree)最大为2。
  2. 节点度数:子节点数量(0,1,2)。
  3. 节点顺序固定:左子节点位于父节点左侧,右子节点位于父节点右侧,改变顺序产生不同的二叉树。
  4. 叶节点(叶子节点、终端节点):叶节点为没有子节点的节点。
  5. 层级:根节点的层级为1,其余节点层级为父节点层级+1。
  6. 高度:从根节点到最远叶节点的最长路径上的边数。叶节点的高度为0,空树的高度为-1。
  7. 完全二叉树:除最后一层,其余层的节点均满,且最后一层节点尽量靠左。
  8. 满二叉树:除叶节点以外,其余节点均有两个子节点。
  9. 二叉搜索树:左节点 < 根节点 < 右节点。
  10. 若根节点的层级为1,则第 i 层做多有2^(i-1)个节点。
  11. 若该二叉树只有一个根节点,且他的深度为1,则深度为 i 的二叉树最大节点数为2^k-1。
  12. 对任何一棵二叉树, 如果其叶结点个数为 n0,度为2的非叶结点个数为 n2,则有 n0 = n2 + 1。

  13. 具有n个结点的完全二叉树的深度k为log2 (n + 1) 上取整。

  14. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为 i 的结点有:

  • 若 i > 0,双亲序号:(i - 1) / 2;i = 0,i 为根结点编号,无双亲结点。
  • 若 2i + 1< n,左孩子序号:2i + 1,否则无左孩子。
  • 若 2i + 2 < n,右孩子序号:2i + 2,否则无右孩子。

2.3  存储

  1. 链式存储(Linked Storage):使用节点对象和指针来表示二叉树的结构。每个节点对象包含存储的数据以及指向左子节点和右子节点的指针。这种存储方式可以直观地表示树的结构,适用于任意形状的二叉树。Java中常用的LinkedList数据结构可以用来实现二叉树的链式存储。
  2. 数组存储(Array Storage):使用数组来表示二叉树的结构。可以使用一维数组或二维数组来存储节点的数据。通过数组的索引关系来表示节点之间的父子关系。这种存储方式可以节省存储空间,但适用于完全二叉树或满二叉树等具有规律结构的二叉树。又称为顺序存储
  3. 堆存储(Heap Storage):使用堆(Heap)数据结构来存储二叉树。堆是一种特殊的完全二叉树,通常使用数组来实现。在堆存储中,节点的位置是通过数组的索引来确定的。堆存储常用于实现优先队列等应用。

三、二叉树的遍历

链式结构的遍历

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
前序/中序/后序的递归结构遍历:是根据访问结点操作发生位置命名

  • NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。根>左>右    A→B→D→E→C
  • LNR:中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。左<根<右       D→B→E→A→C
  • LRN:后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。     左<右<根                    D→E→B→C→A
  • 层序遍历:除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。    A→B→C→D→E

Tips:

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值