绪论
作为树状数据结构最为重要的一个分支——二叉树,和课本一样,在树的后面单独拿出来进行介绍。
Binary tree
Binary tree就是二叉树的意思。在实现和了解二叉树的应用之前,首先需要明白二叉树的定义是什么。有课件上的定义如下:
二叉树的每个结点有两个孩子,每个孩子可能为空或者另一棵二叉树子树。
有另外的定义如下:
每个结点的度都小于等于n的树称为n叉树。
我本来认为这样的定义远比上面模糊且抽象的定义要更加精简确切,但当我仔细品味英文定义中exactly这个词的意思,又有了新的理解:
因为在二叉树中,左右子节点,左右子树往往分别起着不同的作用。
即使一个分支节点只有一个子节点,我们也会称这个子节点为左(右)子节点,空着的指针指向的为空着的右(左)子节点。也就是说另一个结点只是内容上不存在,但它概念上存在,且对另一个子节点“确实”起到了类似于占位的作用,即使只有一个子节点,这个子节点在概念上也需要称为左子节点或者右子节点。
如果你是初学者,只是按照结点度的数值关系来理解二叉树,就会对度为1的结点的子节点还需要分左右而产生困惑,影响后面树堆等的定义的理解(但是对于有一定的基础的人这么理解反而更加简洁ohhhhhhh)。
因为结点的度小于等于2,可以根据结点的度将结点划分为三类:full node,leaf node,neither。
所有的结点都是full node的二叉树称为full binary tree,不过需要注意的是,full虽然是满的意思,但这个full binary tree和满二叉树大概确实不是一个东西hhhh(一个是国内版,一个是国际版)。
这种二叉树比较经典的运用就是哈夫曼树和表达式树。
实现的方面,因为二叉树是树的一个重要的分支(就是说还是属于树),所以(一般的二叉树)和树在类的构造方面上基本都是一致的。