一.搜索二叉树
左子树小,右子树大的树叫作搜索二叉树,一般是没有重复的结点。
如下图
通过此树状结构可以实现类二分查找的效率,但是对于普通的搜索树,
它最坏可能达到O(N)
最好是O(logn)
可以对搜索二叉树进行优化,从而有了平衡二叉树,后面的文章会对其进行讲解(敬请期待)。本文只对普通二叉树进行讲解。
二.实现
(1)结点的构建
(2)类的基本成员
(3)增删查改的实现
Insert基本思想:通过遍历循环的方式,比当前位置小,走左,反之,走右,若相等则返回false(不需要插入,也就是插入失败),直到循环结束,停在插入应插入位置,需要特判根结点是否为空,若为空就直接创建。
Find的基本思想:比当前位置小走左,反之走右,直到相等返回当前位置指针或者遇到空查找失败,返回空指针。
erase的基本思想:分情况删除,删除结点的孩子结点有1个,0个,2个的情况
删除一个结点的情况: 通过循环遍历,查找到要删除位置和要删除位置的父结点,
再找到cur的孩子结点在左还在右,
再让parent指向cur的指针指向唯一的结点,
对于删除头结点的时候,因为parent为空,所以需要特判,直接让cur指向自己的唯一结点(可以是空指针)。
0个孩子结点的情况也可以复用。
删除带有两个孩子结点的结点:通过循环遍历,查找到要删除位置和要删除位置的父结点
第一种情况: 最小右子树的父节点的左指针指向最小右子树结点
从cur,位置开始找,找到右子树的最小结点(既比要删除结点的左子树都大,也比要删除结点的右子树都小,可以替代删除结点)和右子树最小结点的父节点,
找到后最小右子树结点与要删除结点的进行值替换,再删除cur结点,
并且将最小右子树结点的父节点的左指针指向最小右子树结点的右指针(因为最小右子树结点一定是最左,所以左指针不可能再有结点,因此只需要指向右边)
第二种情况:最小右子树的父节点的右指针指针指向最小右子树结点
解决办法,再找到最小右子树结点后,进行判断看最小右子树结点,在父节点的左边还是右边,然后让父节点的右指针指向最小右子树结点的右边即可。