二叉树的小结

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

二叉树

二叉树是树形结构的一种特殊情况,每个节点至多有两个儿子节点,并且有左右之分,不可颠倒。

二叉树有几种特别的情况:

  1. 二叉树:除了叶子节点外所有的节点都有两个儿子节点。 二叉树的小结
  2. 美二叉树:除了叶子节点外的所有节点都有两个儿子节点,并且最后一层是满的。 二叉树的小结
  3. 完全二叉树:除了最后一层外其他蹭都是满的,并且所有节点向左对齐。 二叉树的小结

二叉树的遍历

有三种方式来遍历整个二叉树:先序遍历(也称前序遍历),中序遍历,后序遍历。三个算法的命名是根据根节点被遍历时的相对位置来的,用递归可以很轻松地理解。

前序遍历

从根节点开始,接着遍历左子树,然后是右子树顺序叫做前序遍历。二叉树的小结这颗树使用前序遍历的输出顺序为: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

以上是关于二叉树的小结的主要内容,如果未能解决你的问题,请参考以下文章

二叉树小结

本周小结!(二叉树系列四)

二叉树的小结

数据结构 第5章 树的二叉树 单元小结遍历二叉树和线索二叉树

小结:二叉树的几种实现方式

第5章学习小结