搞懂树结构
1.什么是树结构
树结构是一种非常重要的非线性结构,反应了数据元素之间的层次关系和分支关系。
树的表示方法
- 树型表示法
- 文氏图表示方法
- 凹入图表示法
- 广义表表示法
(A(B1(C1,D1,E1),B2(C2),B3)
2.树的分类
根据树中节点的各子树从左到右是否有次序,能否交换分为
- 有序树
- 无序数
3.二叉树
二叉树并非是树的特殊情形,它和度数为2的有序树是两种不同的数据结构。
3.1二叉树的基本形态
- 空二叉树
- 只有一个根节点
- 根节点只有左子树
- 根节点只有右子树
- 根节点既有左子树又有右子树
3.2二叉树的存储结构
二叉树的存储结构可分为顺序存储和链式存储。
顺序存储
二叉树的顺序存储结构就是把二叉树的所有结点按照一定的次序顺序存储到数组中,数组中只存储结点的值,结点之间的逻辑关系由数组中下标的顺序来体现。如果不是完全二叉树也会看成完全二叉树存入数组,空的子树存入空值。
节点的逻辑关系
顺序二叉树对于完全二叉树而言,既简单又节省存储空间,而对于一般二叉树存储了很多空节点会造成大量的存储空间的浪费。
链式存储
顺序存储一般二叉树会造成大量存储空间的浪费,因此,一般二叉树采用链式存储的方式。
存储节点:每个节点由数据域和两个指针域组成,指针分别指向左儿子和右儿子,如果左儿子为空,则左指针为null。
public class BinNode{
//节点对象
private Object element;
private BinNode left;
private BinNode right;
public BinNode(){
this.left = null;
this.right = null;
}
public BinNode(Object it){
this.left = null;
this.right = null;
this.element = it;
}
//判断叶子节点
public boolean isLeaf(){
return (left == null)&&(right == null);
}
//设置左孩子
public BinNode setLeft(BinNode node){
return lefe = node;
}
//获取左孩子
public BinNode left(){
return left;
}
//设置右孩子
public BinNode setRight(BinNode node){
return right = node;
}
//获取右孩子
public BinNode right(){
return right;
}
}
3.3二叉树的遍历
二叉树的遍历是指从根节点出发,按照某种次序访问所有节点,使得每个节点被访问依次且仅被访问依次
前序遍历
先遍历根节点,再遍历左子树,最后才遍历右子树
public void inOrder(BinNode rt){
if (rt == null){
return;
}
print(rt);
inOrder(rt.left());
inOrder(rt.right())
}
中序遍历
先遍历左子树,再遍历根节点,最后才遍历右子树
public void inOrder(BinNode rt){
if (rt == null){
return;
}
inOrder(rt.left());
print(rt);
inOrder(rt.right())
}
后序遍历
先遍历左子树,再 遍历右子树,最后擦遍历根节点。
public void inOrder(BinNode rt){
if (rt == null){
return;
}
inOrder(rt.left());
inOrder(rt.right());
print(rt);
}
记忆总结:根据访问的位置来区分前序,中序和后序
层次遍历
从根节点开始,从上至下逐层遍历,在同一层,则从左到右的顺序对节点逐个访问。
3.4二叉树分类
- 普通二叉树
- 斜树
- 左斜树
- 右斜树
- 完全二叉树
- 平衡二叉树
- 排序二叉树
- 线索二叉树
记忆总结:根据访问的位置来区分前序,中序和后序
层次遍历
从根节点开始,从上至下逐层遍历,在同一层,则从左到右的顺序对节点逐个访问。
3.4二叉树分类
- 普通二叉树
- 斜树
- 左斜树
- 右斜树
- 完全二叉树
- 平衡二叉树
- 排序二叉树
- 线索二叉树
注:仅用于学习交流