二叉排序树:BST(Binary Sort(Search) Tree),对于二叉排序树的任何一个非叶子结点,要求左子结点的值比当前结点的值小,右子结点的值比当前结点的值大。
特别说明:如果有相同的值,可以将该结点放在左子结点或右子结点。
例如L:针对前面的数据(7,3,10,12,5,1,9),对应的二叉排序树为:
![图片说明](https://uploadfiles.nowcoder.com/images/20200614/319217495_1592107719505_82BD01A3BBDD75FB4AB4917C42CA1752 "图片标题")
插入数值2后的:
![图片说明](https://uploadfiles.nowcoder.com/images/20200614/319217495_1592107776319_72CF9C081314D1508D1A2FA72CCD2BB4 "图片标题")
二叉排序树创建和遍历
一个数组创建成对应的二叉排序树,并使用中序遍历二叉排序树,比如:数组Array(7,3,10,12,5,1,9),创建成对应的二叉排序树为:
![图片说明](https://uploadfiles.nowcoder.com/images/20200614/319217495_1592107976532_C2BF77621676AC976668AB9812788658 "图片标题")
二叉排序树的删除
需要分为以下三种情况考虑
1)删除叶子结点
2)删除只有一颗子树的结点
3)删除有两颗子树的结点
针对上面三种情况做思路分析
1)删除叶子节点
①需要先找到需要删除的结点targetNode
②找到targetNode的父节点parent
③确定targetNode是parent的左子结点,还是右子结点
④
左子节点:parent.left=null
右子结点:parent.right=null
2)删除只有一颗子树的结点
①需要先找到要删除的结点targetNode
②找到targetNode的父节点parent
③确定targetNode的子结点是左子结点,还是右子结点
④确定targetNode是parent的左子节点还是右子结点
⑤如果targetNode有左子结点
5.1如果targetNode是parent的左子结点
parent.left=target.left;
5.2如果targetNode是parent的右子结点
parent.right=targetNode.left;
⑥如果targetNode有右子结点
6.1如果targetNode是parent的左子结点
parent.left=targetNode.right;
6.2如果targetNode是parent的右子结点
parent.right=targetNode.right
3)删除有两颗子树的结点
①需要先找到要删除的结点targetNode
②找到targetNode的父节点parent
③从targetNode的右子树找到最小的结点
④用一个临时变量,将最小结点的值保存temp
⑤删除该最小结点
⑥targetNode.value=temp
代码实现: