1.什么是树?
树是具有一对多关系的数据结构,像树倒过来一样,有一个根,多个分支。用数据结构来描述的话,就是n个节点构成的具有层次关系的有限集合。
2.树的相关概念
节点:书中的每一个数据元素都是节点
节点的度:节点的子树个数
树的度:树中所有节点最大的度
叶子节点:度为0的节点,就是没有分支的节点。
节点的层次(也成为树的深度🌲):树的根开始,所在的层为第一层,以此类推
3.树的特点?
子树不相交
除了根节点之外,每个节点都有且只有一个父节点,也叫双亲节点。
一个有N个节点的树,有N-1条边线连接
4:二叉树:
什么是二叉树?
二叉树(Binary Tree)是n(n >= 0)个节点的有限集合,该集合或者空集(称为空二叉树),或者有一个根节点和两颗互不相交的,
分别称为根节点的左子树和右子树的二叉树组成。
二叉树的特点?
1.每个节点最多两个字树
2.左子树和右子树有顺序
特殊二叉树:
1.斜树
所有节点只有左节点的叫左斜树,所有节点只有右节点的叫右斜树
2.满二叉树
二叉树中除了叶子节点,每个节点的度都为2,则此二叉树为满二叉树。
3.完全二叉树
二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。这样的二叉树称为完全二叉树
A
B C
D E F G
H
前序遍历:
当前节点 -> 左子树 -> 右子树
A->B->D->H-E->C->F->G
中序遍历
左子树->当前节点->右子树
H->D->B->E->A-F-C-G
后序遍历
左子树->右子树->当前节点
H->D->E->B-F->G-C-A
//前序遍历利用递归方法
public static void pre(TreeNode cur) {
if(cur == null) {
return;
}
System.out.println("遍历得到的数据是" + cur.data);
pre(cur.leftNode);
pre(cur.rightNode);
}
/**
* 中序遍历
* @param cur
*/
public static void premid(TreeNode cur) {
if(cur == null) {
return;
}
premid(cur.getLeftNode());
System.out.println(cur.getData());
premid(cur.getRightNode());
}
/**
* 后序遍历
* @param cur
*/
public static void preafter(TreeNode cur) {
if(cur == null) {
return;
}
preafter(cur.getLeftNode());
preafter(cur.getRightNode());
System.out.println(cur.getData());
}
public static void main(String[] args) {
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");
TreeNode h = new TreeNode("H");
a.setLeftNode(b);
a.setRightNode(c);
b.setLeftNode(d);
b.setRightNode(e);
c.setLeftNode(f);
c.setRightNode(g);
d.setLeftNode(h);
//前序遍历
pre(a);
//中序遍历
premid(a);
//后序遍历
preafter(a);
}
问题1: 前序遍历为:ABCDEF。中序遍历为CBAEDF。 后续的遍历为? CBEFDA
问题2: 中序遍历为ABCDEFG 后序遍历为BDCAFGE。 前序遍历为??? EACBDGF
二叉树建立:
在内存中,将二叉树的每个节点的空指针引出一个虚节点指向“#”,成为二叉树的扩展二叉树, AB#D##C##
哈夫曼树:
又名最优二叉树
哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近。
带权路径是什么? 带权,个人理解就是比重。可以理解为该条路径占所有路径的百分比
路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1
结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积
树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL(weighted path length) ,权值越大的结点离根结点越近的二叉树才是最优二叉树
WPL最小的二叉树就是赫夫曼树