个人主页 ?:喜欢做梦
二叉树中有一个树,我们可以猜到他和树有关,那我们先了解一下什么是树,在来了解一下二叉树
一?、树型结构
1?.什么是树型结构?
树是一种非线性的数据结构,它是由n(n>=0)个有限节点(结点)和边组成的层次结构的集合。有一个特定的节点为根节点,其余节点通过边连接形成的分支,每个节点可以有零个或多个子节点。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的。
什么是线性结构?什么是非线性结构?
线性结构:数据元素呈现一对一的线性关系,除第一个和最后一个元素外,每个元素都有且仅有一个直接前驱和一个直接后继;
非线性结构:数据元素之间的关系不是简单的一对一,一个元素可能有多个前驱或后继,或者两者都有。
树的定义是递归的;除根节点外的每一个结点都能引出一颗子树;树型结构中,子树之间不能有交集,否则就不是树型结构; 除了跟节点之外,每个节点有且只有一个父节点;一个N个节点的树有N-1条边,因为根节点的上方没有边;2?.什么是非树型结构?
非树:节点间的连通性复杂,可能存在多个路径连接统一对节点,也肯存在孤立节点,即与其他节点无连接。
3?.树型结构的基本性质
4?.树的表现形式(了解)
树的表现形式有很多种,如双亲表示法,孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。这里简单了解一下其中最常见的方法就是孩子兄弟表示法:
class Node{ public int value;//数据 public Node firstChild;//第一个孩子 public Node nextBrother;//下一个兄弟}
二?、二叉树
1?.什么是二叉树?
二叉树:二叉树是每个结点最多有两科子树的树的结构,其两个子树通常称为左子树和右子树。
二叉树的递归定义:
或者是一颗空树;或者是一颗由一根结点和两课互不相交的分别称为左子树和右子树所组成的非空数,左子树和右子树又同样是二叉树;特点:
度的限制:结点的度最大为2;有序性:左右子树由顺序,即使某节点只有一颗子树,也要区分左右子树;性质:
若规定的根节点层数为1,这一棵非空二叉树的第i层上最多有

2?.二叉树的类型
1.满二叉树
满二叉树:每一层的结点树都达到最大,除最后一层外每个节点都有两个节点。
特点:
节点度数:除最后一层的叶子节点外,其他层的每一个的节点都有两个节点,即度都为2;叶子节点:所有的叶子节点都在同一层,且叶子节点的数量为

2.完美二叉树
完美二叉树:除最后一层外,其余层节点数都达到最大,最后一层节点从左到右依次按顺序排列,可通过数组的高效和访问,完美二叉树是满二叉树的一种。
特点:
节点度数:除了底层的叶子节点外,其余所有节点都有两个子节点,即度数均为2;叶子节点分布:所有叶子节点都在同一层,这使得树的结构呈现出完美的形态;具有n个节点的完全二叉树的深度k为
3?.二叉树的创建
public class BinaryTree { public static class TreeNode{ public char val;//数据 public TreeNode left;//左孩子 public TreeNode right;//右孩子 public TreeNode(char val) { this.val = val; } } public TreeNode createTree(){ //创建节点 TreeNode A=new TreeNode('A'); TreeNode B=new TreeNode('B'); TreeNode C=new TreeNode('C'); TreeNode D=new TreeNode('D'); TreeNode E=new TreeNode('E'); TreeNode F=new TreeNode('F'); TreeNode G=new TreeNode('G'); //连接节点 A.left=B; A.right=C; B.left=D; B.right=E; C.left=F; C.right=G; return A; }}
4.二叉树的遍历
二叉树的遍历是指按照一定的顺序访问二叉树中的每个节点,且每个节点仅被访问一次。
二叉树的遍历方式主要有前序遍历、中序遍历、后序遍历;
前序遍历
前序遍历:遍历顺序是先访问根的的节点—>左子树—>右子树,也就是根、左、右;
前序遍历代码:
// 前序遍历 public void preOrder(TreeNode root){ //判断是否有节点,没有返回 if(root == null){ return; } System.out.print(root.val+ " "); //遍历左子树 preOrder(root.left); //遍历右子树 preOrder(root.right); }
中序遍历
中序遍历:遍历顺序是先访问左子树—>根的的节点—>右子树,也就是左、根、右;
中序遍历代码:
// 中序遍历 public void inOrder(TreeNode root){ //判断是否有节点,没有返回 if(root == null){ return; } //遍历左子树 preOrder(root.left); System.out.print(root.val+ " "); //遍历右子树 preOrder(root.right); }
后序遍历
后序遍历:遍历顺序是先访问左子树—>右子树—>根的的节点,也就是左、根、右;
// 后序遍历 public void postOrder(TreeNode root){ //判断是否有节点,没有返回 if(root == null){ return; } //遍历左子树 preOrder(root.left); //遍历右子树 preOrder(root.right); System.out.print(root.val+ " "); }}
后序遍历的过程与前面的也是同理,就不画图过多解释了。
顺序:左子树--右子树--根节点;根结点的打印位置:最后一个;三者之间的区别:
前序遍历 | 中序遍历 | 后序遍历 | |
访问顺序 | 根、左、右 | 左、根、右 | 左、右、根 |
根节点访问位置 | 第一个 | 中间 | 最后一个 |
应用场景 | 二叉树结构、将表达式树转换为前缀表达式 | 用于输出有序序列,还能辅助将表达式树转换为中缀表达式 | 二叉树的高度、节点数,以及释放二叉树内存 |
层序遍历
层序遍历:从上至下,从左至右逐层访问就是层序遍历。
层序遍历的代码,我后期补上,或者下篇在写,这篇就到这里啦~
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3k88uddoizs48