【数据结构】二叉树

二向箔安全员
• 阅读 1889

二叉树

:一对多(即父节点对应多个子节点)。
:父节点对应的子节点总数。
层次:以根节点为1,依次往下递增。
深度:树的最大层次。
森林:树的集合。

Ps:树中的每个节点是不是也可以看做一棵树?

二叉树

二叉树:度为2的树(即左/右子节点)。
分类:满二叉树、完全二叉树、平衡二叉树。

满二叉树

【数据结构】二叉树
满二叉树很好理解,是一个类似金字塔的结构。
可以这么说,满二叉树的每一层次都不允许有空节点

完全二叉树

【数据结构】二叉树
完全二叉树可以分为两部分(最底层和上层(非最底层))。
上层是一个满二叉树
最底层从左到右中间不允许存在空节点

平衡二叉树

左/右子树的深度相差不超过1即为平衡二叉树。

为什么需要平衡二叉树?

二叉树通常作用二叉查找树二叉堆(如堆排序)。
在一些极端情况下,二叉树会退化为链表,导致查询性能退化。
平衡二叉树的意义就是新增节点时,平衡树的结构,使左/右子树的深度接近,优化查询性能。

常用实现:红黑树、AVL、Treap、伸展树、SBT。

二叉树的遍历

【数据结构】二叉树

先序遍历

根节点 -> 左子树 -> 右子树

1 以A为根节点( => A)
2 遍历左子树 (B)

2.1 以B为根节点( => B)
2.2 遍历左子树 (D)
    2.2.1 以D为根节点( => D)
2.3 遍历右子树 (E)
    2.3.1 以E为根节点( => E)

3 遍历右子树 (C)

3.1 以C为根节点( => C)
3.2 遍历左子树 (F)
    3.2.1 以F为根节点( => F)
3.3 遍历右子树 (G)
    3.3.1 以G为根节点( => G)

先序遍历: A, B, D, E, C, F, G

PS: 在有序的二叉树中,先序遍历顺可作为二叉树的构造顺序

中序遍历

左子树 -> 根节点 -> 右子树

1 遍历左子树 (B)

1.1 遍历左子树 (D)
    1.1.1 以D为根节点( => D)
1.2 以B为根节点( => B)
1.3 遍历右子树 (E)
    1.3.1 以E为根节点( => E)

2 以A为根节点( => A)
3 遍历右子树 (C)

3.1 遍历左子树 (F)
    3.1.1 以F为根节点( => F)
3.2 以C为根节点( => C)
3.3 遍历右子树 (G)
    3.3.1 以G为根节点( => G)

中序遍历: D, B, E, A, F, C, G

后序遍历

左子树 -> 右子树 -> 根节点

1 遍历左子树 (B)

1.1 遍历左子树 (D)
    1.1.1 以D为根节点( => D)
1.2 遍历右子树 (E)
    1.2.1 以E为根节点( => E)
1.3 以B为根节点( => B)

2 遍历右子树 (C)

3.1 遍历左子树 (F)
    3.1.1 以F为根节点( => F)
3.2 遍历右子树 (G)
    3.2.1 以G为根节点( => G)
3.3 以C为根节点( => C)

3 以A为根节点( => A)

后序遍历: D, E, B, F, G, C, A

Java实现简单二叉树

树节点

class BinaryTree<T> {
    
    static class TreeNode<T> {
        /** 数据 */
        T data;
        /** 父节点 */
        TreeNode<T> parent;
        /** 左子树 */
        TreeNode<T> left;
        /** 右子树 */
        TreeNode<T> right;
    }
    
    TreeNode<T> root;
    
}
点赞
收藏
评论区
推荐文章
似梦清欢 似梦清欢
2年前
树与二叉树
二叉树层次建树二叉树(BinaryTree)是由有限个结点组成的集合,它或者为空集合,或者仅含一个根结点,或者由一个根结点和两棵互不相交的左、右子树组成。树为空即根节点为空。二叉树的基本形态如下图:a:空的二叉树,treeNULL。b:只有空节点的二叉树,
zhenghaoz zhenghaoz
4年前
算法笔记:红黑树
红黑树,一种平衡二叉树,最为著名的应用就是CSTL中的map,是有序集合最为理想的存储方式之一。除了二叉树所具有的属性之后,红黑树中每个节点多了一个“颜色”属性,可以是红色或者是黑色。一棵红黑树应该满足一下的性质:1.每个节点是红色或者黑色的;2.根节点是黑色的;3.每个叶节点nil是黑色的(使用哨兵节点在删除调整时可以方便不少);4.如
Stella981 Stella981
3年前
B+树原理以及Java代码实现
最初查找二叉树,由于树的高度会随着有序序列输入而急剧增长,后来出现平衡二叉树,红黑树。B树可以海量数据的快速查询检索,B树主要分为B树(B树),B树,B\树等。B树(B树)M路搜索树,参数M定义节点的分支个数;对于根节点孩子数目为\2,M\,对于其余节点孩子数目为\M/2,M\;每个节点含有关键字属性,至少M/21
Wesley13 Wesley13
3年前
Java实现 LeetCode 814 二叉树剪枝 (遍历树)
814\.二叉树剪枝给定二叉树根结点root,此外树的每个结点的值要么是0,要么是1。返回移除了所有不包含1的子树的原二叉树。(节点X的子树为X本身,以及所有X的后代。)示例1:输入:\1,null,0,0,1\输出:\1,null,0,null,1\解释:
Wesley13 Wesley13
3年前
PHP数据结构与算法:树
一、概念树(Tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n1)个有限节点组成一个具有层次关系的集合。看起来向一颗根朝上叶朝下的的倒挂树。每个节点有零个或多个子节点没有父节点的节点称为根节点每一个非根节点有且只有一个父节点除根
Wesley13 Wesley13
3年前
PHP数据结构与算法:二叉树
一、定义二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(leftsubtree)和“右子树”(rightsubtree)。二、特性1.在二叉树的第i层上至多有2^(i1)个结点(i0)2.深度为k的二叉树至多有2^k1个结点(k0)3.对于任意一棵二叉树,如果其叶结点数为N0,而
Wesley13 Wesley13
3年前
B
BTreeBTree又叫做B树,和平衡二叉树不同的地方在于B树是多叉树(平衡多路查找树),Oracle和MongoDB的索引技术就是基于B树的数据结构,B树也可以看作是对23查找树的一种扩展。一个m阶的BTree有以下性质1.每个节点最多有m个子节点;2.每个非叶子节点(根节点除外)至少含有m/2个子节点;3.
Stella981 Stella981
3年前
LeetCode112
非商业,LeetCode链接附上:https://leetcodecn.com/problems/pathsum/进入正题。题目:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和
Wesley13 Wesley13
3年前
JZ18 二叉树镜像
JZ18二叉树镜像题目操作给定的二叉树,将其变换为源二叉树的镜像。思路先遍历,节点入栈,再依次出栈调换左右节点遍历的过程中调换左右节点代码coding:utf8classTreeNode:def__init__
菜园前端 菜园前端
2年前
什么是二叉树?
原文链接:什么是二叉树?树中每个节点最多只能有两个子节点,在JavaScript中一般都是通过Object来模拟二叉树。常用操作前序遍历中序遍历后序遍历前序遍历根左右。口诀:1.访问根节点2.对根节点的左子树进行前序遍历3.对根节点的右子树进行前序遍历通过
贾蔷 贾蔷
2星期前
手搓二叉树构建类代码详解:从入门到实践(适合新手小白)
一、简介和应用二叉树是数据结构中常见的一种树形结构,每个节点最多有两个子节点(左子节点和右子节点)。它广泛应用于算法设计、数据存储与搜索(如二叉搜索树)、表达式解析等领域。本文将通过手写的C代码,讲解如何构建一个基础的二叉树类,帮助新手理解其原理与实现