二叉搜索树:对任何节点N,其左子树中的最大值value不超过过N的value,其右子树中的最小值不小于N的value。
树的遍历
二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序遍历、中序遍历、后序遍历其实指的是父节点被访问的次序。以先序遍历为例,遍历顺序为先遍历父节点,再次左节点,最后遍历右节点。
首先定义一个TreeNode类,二叉树使用链表实现,以下就是数据结构,value为关键字,left是左节点,right为右节点。
下面是一个二叉排序树(8,2,4,7,9,3,1,6,11,10,18)。
先序打印结果为:8,2,1,4,3,7,6,9,11,10,18,使用递归实现,代码比较简单。
二叉搜索树-查询
查询比较简单,根据二叉搜索树的特征,可以对比关键字大小从而从左右子树中查找,如果找不到返回null,实现算法比较简单递归或者while循环都可以。
二叉搜索树-插入
在二叉搜索树中插入一个节点,只要找到插入节点的父节点即可,如果小于父节点的关键字插入到左子数中,否则插入右子树中。
实现步骤为,首先生成一个节点TreeNode,此时左右节点和父节点都为null,检查根节点是否是null,如果是null,当前节点直接作为根节点,再次从左右子树中找到插入节点的父节点,如果小于父节点的关键字插入到左子数中,否则插入右子树中。
二叉搜索树-删除
二叉搜索树的删除情况比较复杂,分多个情况,
如果待删除的节点的左节点为空,只要把待删除节点的右节点移动到删除节点上即可。
如果待删除的节点的右节点为空,只要把待删除节点的左节点移动到删除节点上即可。
如果待删除的节点的左右节点都不为空,此种情况需要找到当前节点的后继节点(参照后面的前驱后继介绍),找到后继节点后分2个步骤,(1)把后继节点的右节点替换后继节点,(2)把后继节点替换要删除的节点,示例图如下:
Java代码实现,replace函数为替换节点,delete函数为删除节点,以下为伪代码实现。
前驱和后继结点
中序遍历是左中右的顺序遍历,前驱节点就是中序遍历中的上一个节点,后续节点就是中序遍历中的下一个节点。
获取前驱节点的算法,分两种3种情况:
如果当前节点有左节点,前驱节点就是左子树的最右的节点
如果当前节点没有左节点,往上找,如果当前节点是parent的右的节点,则parent节点就是前驱,如果不是接着往上查找直到parent是parent.parent的右节点则parent.parent就是前驱,或者直到根节点。
如果没有父节点,此节点就是根节点,也就没有前驱节点
获取后继结点的算法,也分两种3种情况:
如果当前节点有右节点,后继结点是右子树的最左的节点
如果当前节点没有右节点,如果当前节点是parent的左的节点,则parent节点就是后继,如果不是接着往上查找直到parent是parent.parent的左节点则parent.parent就是后继,或者直到根节点。
如果没有父节点,此节点就是根节点,也就没有前驱节点
后继的Java实现如下:
历史文章:
理解数据结构之树(一)