数据结构[2] -- 二叉搜索树(BST)

二叉搜索树操作集

二叉搜索树:一个节点的左子节点的关键字的值小于这个节点,右子节点的关键字的值大于或者等于这个父节点

查找节点

在查找过程中,用变量current来保存正在查看的节点,参数key是要查找的值,查找从root开始,因此开始把current设为根。之后,在while循环中,将要查找的值,keyiData做比较。小于,则current设为左节点,大于则设为右节点。

插入节点

current在查找过程中会变成null才能发现它查找的上一个节点是不是空节点,因此,引入一个新的变量parent(current父节点)来存储遇到的最后一个不是null的节点。

  1. 查找null节点
  2. 空树root=newNode
  3. 插入叶节点,即parent没有左子节点 parent.leftChild=newNode
  4. 插入非叶节点,即parent没有右子节点`parent.rightChild=newNode

二叉树高度

  • PostOrderGetHeight Height=MAX(Hl,Hr)+1

查找最大最小值

  • 最大元素一定在树的最右端分支的端节点
  • 最小元素一定在树的最左端分支的端节点

遍历树

  • 中序遍历 inOrder left->root->right

  • 前序遍历 preOrder root->left->right

  • 后序遍历 postOrder left->right->root

  • 层序遍历 levelTravel

    • root入队
    • 如果队列不为空,则进入循环

    • 队首元素出队,并输出

    • 如果该队首元素有左孩子,则将其左孩子入队
    • 如果该队首元素有右孩子,则将其右孩子入队

删除节点

  • 没有子节点
    找到节点后,首先判断是不是root,如果是的话,就将它置为null,否则,就把父节点leftChild或者rightChild置为null
  • 有一个子节点
    • 要删除的节点的子节点有左子节点或者右子节点,并且每种情况中的要删除的节点也可能是自己父节点的左子节点或者右子节点
    • 被删除的节点是根,他没有父节点,需要被合适的子树所代替
  • 有两个子节点
    删除有两个字节点的节点,用它的中序后继来代替该节点 getSuccessor()
    寻找后继节点:比要删除节点大的下一个节点 right->left->left->...->left->left=null
    • 后继节点是delNode节点的右子节点
      current从它的父节点的rightChildorleftChild删掉,然后指向后继节点
      current的左子节点插到后继节点的leftChild
    • 后继节点是delNode节点的左子节点
      后继节点的leftChild置为后继节点的右子节点
      后继节点的rightChild置为要删除节点的右子节点
      current从它父节点的rightChild字段移除,把这个字段置为successor
      current的左子节点从current移除,successorleftChild的字段置为successor

Github

完整代码,我托管在Github上,如果对你有帮助,请给我点个star以示肯定和鼓励。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值