简介
树的相关术语
结点:使用数结构存储的每个数据元素都被称为“节点”
结点的度:某个节点所拥有的子树的个数
树的深度:树中结点的最大层数
叶子结点:度为0的结点,也叫终端节点
分支结点:度不为0的结点,也叫非终端结点或内部结点
孩子:也可称为子树或者子结点,表示当前结点下层的直接结点
双亲:也可称为父结点,表示当前结点的直接上层结点
根结点:没有双亲结点的结点,在一个树形结构中只有一个根结点
祖先:从当前结点上层的所有的结点
子孙:当前结点下层的所有的结点
兄弟:同一双亲的孩子
二叉树
简介
二叉树(Binary Tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构 往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其 算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树, 且有左右之分
二叉树分类
满二叉树
完全二叉树
完全二叉树,除最后一层可能不满以外,其他各层都达到该层节点的最大数,最后一层 如果不满,该层所有节点都全部靠左排。 <br />
二叉树的遍历
前序遍历
中序遍历
后续遍历
层序遍历
从根节点出发,依次访问左右孩子结点,再从左右孩子出发,依次它们的孩子结点,直 到节点访问完毕
二叉树排序
自定义树形结构容器
树形结构定义条件:
- 能够找到当前结点的父结点
- 能够找到当前结点的子结点
- 能够找到当前结点的兄弟结点
- 能够找到当前结点的祖先结点
- 能够找到当前结点的子孙节点
树形结构容器使用
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyTree<E> {
private Map<E,E> map= new HashMap<>();
private Map<E,List<E>> map2=new HashMap<>(); //用string 映射List
/**
* 向容器添加元素
*/
public void add(E parent,E item){
//先完成单结点之间映射
this.map.put(item,parent);
//完成多结点之间映射
List<E> list=this.map2.get(parent);
//判断当前结点下是否含有子结点,如果没有创建一个新的List
if(list==null){
list=new ArrayList<>();
this.map2.put(parent,list);
}
list.add(item);
}
/**
* 获取当前结点的父结点
*/
public E getParent(E item){
return this.map.get(item);
}
/**
* 获取当前结点的子结点
*/
public List<E> getChild(E item){
return this.map2.get(item);
}
/**
* 获取当前结点的兄弟结点
*/
public List<E> getBrother(E item){
//获取当前结点的父结点
E parent=this.getParent(item);
//获取当前父结点的所有的子节点
List<E> list=this.getChild(parent);
List<E> brother=new ArrayList<>();
if(list!=null){
brother.addAll(list);
brother.remove(item);
}
return brother;
}
/**
* 获取当前结点祖先结点
*/
public List<E> getForeFathers(E item){
//获取当前结点的父结点
E parent=this.getParent(item);
//递归结束的条件
if(parent==null){
return new ArrayList<>();
}
List<E> list=this.getForeFathers(parent);
//将递归到的所有结点元素添加到返回的list中
list.add(parent);
return list;
}
/**
* 获取当前结点子孙结点
*/
public List<E> getGrandChildren(E item){
//存放所有子孙结点中的元素
List<E> list=new ArrayList<>();
//获取当前结点的子结点
List<E> child=this.getChild(item);
//递归结束的条件
if(child==null){
return list;
}
//遍历子结点
for(int i=0;i<child.size();i++){
//获取结点中的元素
E elem=child.get(i);
List<E> temp=this.getGrandChildren(elem);
list.add(elem);
list.addAll(temp);
}
return list;
}
public static void main(String[] args) {
MyTree<String> myTree = new MyTree<>();
myTree.add("root","生物");
myTree.add("生物","植物");
myTree.add("生物","动物");
myTree.add("生物","菌类");
myTree.add("动物","脊椎动物");
myTree.add("动物","脊索动物");
myTree.add("动物","腔肠动物");
myTree.add("脊椎动物","哺乳动物");
myTree.add("脊椎动物","鱼类");
myTree.add("哺乳动物","猫");
myTree.add("哺乳动物","牛");
myTree.add("哺乳动物","人");
}
}