二叉树中有一个树,我们可以猜到他和树有关,那我们先了解一下什么是树,在来了解一下二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限节点(结点)和边组成的层次结构的集合。有一个特定的节点为根节点,其余节点通过边连接形成的分支,每个节点可以有零个或多个子节点。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的。
什么是线性结构?什么是非线性结构? 线性结构:数据元素呈现一对一的线性关系,除第一个和最后一个元素外,每个元素都有且仅有一个直接前驱和一个直接后继; 非线性结构:数据元素之间的关系不是简单的一对一,一个元素可能有多个前驱或后继,或者两者都有。
非树:节点间的连通性复杂,可能存在多个路径连接统一对节点,也肯存在孤立节点,即与其他节点无连接。
树的表现形式有很多种,如双亲表示法,孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。这里简单了解一下其中最常见的方法就是孩子兄弟表示法:
class Node{
public int value;//数据
public Node firstChild;//第一个孩子
public Node nextBrother;//下一个兄弟
}
二叉树:二叉树是每个结点最多有两科子树的树的结构,其两个子树通常称为左子树和右子树。
二叉树的递归定义:
(i>.0)个节点;
(k>=0);
满二叉树:每一层的结点树都达到最大,除最后一层外每个节点都有两个节点。
,k为数的高度;
;
完美二叉树:除最后一层外,其余层节点数都达到最大,最后一层节点从左到右依次按顺序排列,可通过数组的高效和访问,完美二叉树是满二叉树的一种。
(n+1)上取整进1;
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+ " ");
}
}
后序遍历的过程与前面的也是同理,就不画图过多解释了。
前序遍历 | 中序遍历 | 后序遍历 | |
---|---|---|---|
访问顺序 | 根、左、右 | 左、根、右 | 左、右、根 |
根节点访问位置 | 第一个 | 中间 | 最后一个 |
应用场景 | 二叉树结构、将表达式树转换为前缀表达式 | 用于输出有序序列,还能辅助将表达式树转换为中缀表达式 | 二叉树的高度、节点数,以及释放二叉树内存 |
层序遍历:从上至下,从左至右逐层访问就是层序遍历。
层序遍历的代码,我后期补上,或者下篇在写,这篇就到这里啦~