二叉树的小结
Posted 谢本齐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的小结相关的知识,希望对你有一定的参考价值。
树
二叉树
二叉树的遍历
前序遍历
中序遍历
后序遍历
有关树的计算
树
❝树是一种抽象数据结构(ADT),它是有限个元素组成的一个有层次关系的集合。
❞
我们通常用家庭关系来形象地描述节点间的关系。
图中a节点是该树的根节点,它有两个儿子节点b和c,b和c互称为兄弟节点或者姊妹节点。
-
没有儿子节点的节点称为叶子节点
像上图中的节点c,d,e都属于叶子节点。
-
度指的是所有分叉数的最大值。
比如上图a的度是2,b的度是2,c,d,e的度是0,所以这棵树的度为2。如果是下面这颗树,那么它的度为3。
-
每一层节点数的最大值为2 n-1
如第三层节点最大值为23-1=4
二叉树
二叉树是树形结构的一种特殊情况,每个节点至多有两个儿子节点,并且有左右之分,不可颠倒。
二叉树有几种特别的情况:
-
二叉树:除了叶子节点外所有的节点都有两个儿子节点。 -
美二叉树:除了叶子节点外的所有节点都有两个儿子节点,并且最后一层是满的。 -
完全二叉树:除了最后一层外其他蹭都是满的,并且所有节点向左对齐。
二叉树的遍历
有三种方式来遍历整个二叉树:先序遍历(也称前序遍历),中序遍历,后序遍历。三个算法的命名是根据根节点被遍历时的相对位置来的,用递归可以很轻松地理解。
前序遍历
从根节点开始,接着遍历左子树,然后是右子树顺序叫做前序遍历。这颗树使用前序遍历的输出顺序为:abdec
我们新建一个「TreeNode」类:
public class TreeNode {
/**
* @description: 二叉树的遍历测试类
* @program: data 节点的数据域
* @program: leftChild 节点的左孩子节点
* @program: rightChild 节点的右孩子节点
**/
String data;
TreeNode leftChild;
TreeNode rightChild;
public TreeNode(String data) {
this.data = data;
}
}
然后就是实现前序遍历方法:
public static void preOrder(TreeNode t) {
/**
* @description: 前序遍历递归实现
**/
if (t != null) {
System.out.print(t.data + " ");
}
if (t.leftChild != null) {
preOrder(t.leftChild);
}
if (t.Child != null) {
preOrder(t.rightChild);
}
}
中序遍历
中序遍历就是先遍历左子树,然后是根节点,然后是右子树。这颗树使用中序遍历输出顺序为:dbeac
public static void inOrder(TreeNode t) {
/**
* @description: 中序遍历递归实现
**/
if (t == null) {
return;
}
inOrder(t.leftChild);
System.out.print(t.data + " ");
inorder(t.rightChild);
}
后序遍历
后序遍历就是先遍历左子树,然后是右子树,然后是根节点。这颗树使用后序遍历的输出顺序为:debca
public static void postOrder(TreeNode t) {
/**
* @description: 后序遍历递归实现
**/
if (t == null) {
return;
}
postOrder(t.leftChild);
postOrder(t.rightChild);
System.out.print(t.data + " ");
}
有关树的计算
-
在任意一颗树中,节点总数=总分支数+1
例:若在一颗度为4的树中,度为1,2,3,4的节点个数分别为2,2,1,1,则这棵树的叶子节点数为?
设叶子节点的个数为x,根据公式:x+2+2+1+1=0 * x+1 * 2+2 * 2+3 * 1+4 * 1+1
得出x=7;
-
满二叉树前n层的节点总数=2 n-1
例:已知一棵完全二叉树的第6层(设根结点为第1层)有8个叶子结点,则该完全二叉树的结点个数最多是多少?最少是多少?
完全二叉树除了最后一层其他层都是满的。
第6层有8个叶子节点,则只能是倒数第二层或者最后一层。若第六层是最后一层,上五层是满二叉树加上第六层的八个叶子节点:25-1+8=39个。若第六层是倒数第二层,并且有8个叶子节点,补全这8 * 2=16个节点就是一个满二叉树:27-1-16=111个
另外就是有关哈夫曼树的知识了,推荐阅读:勉旃-哈夫曼树的构建、编码以及带权路径长计算https://blog.csdn.net/yushupan/article/details/82735773
以上是关于二叉树的小结的主要内容,如果未能解决你的问题,请参考以下文章