码迷,mamicode.com
首页 > 其他好文 > 详细

求二叉搜索树的前驱节点和后继节点

时间:2017-03-19 14:12:47      阅读:490      评论:0      收藏:0      [点我收藏+]

标签:otto   实现   jpg   最大   分享   int   order   null   back   

前驱结点:节点val值小于该节点val值并且值最大的节点 

后继节点:节点val值大于该节点val值并且值最小的节点


技术分享

 二叉树的节点val值是按照二叉树中序遍历顺序连续设定。

前驱结点

  • 如图4的前驱结点是3
  • 2的前驱结点是1
  • 6的前驱结点是5

后继节点

  • 7的后继结点是8
  • 5的后继节点是6
  • 2的后继节点是3


前驱节点

  1. 若一个节点有左子树,那么该节点的前驱节点是其左子树中val值最大的节点(也就是左子树中所谓的rightMostNode)
  2. 若一个节点没有左子树,那么判断该节点和其父节点的关系 
    2.1 若该节点是其父节点的右边孩子,那么该节点的前驱结点即为其父节点。 
    2.2 若该节点是其父节点的左边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的右边孩子(可参考例子2的前驱结点是1),那么Q就是该节点的后继节点

后继节点

  1. 若一个节点有右子树,那么该节点的后继节点是其右子树中val值最小的节点(也就是右子树中所谓的leftMostNode)
  2. 若一个节点没有右子树,那么判断该节点和其父节点的关系 
    2.1 若该节点是其父节点的左边孩子,那么该节点的后继结点即为其父节点 
    2.2 若该节点是其父节点的右边孩子,那么需要沿着其父亲节点一直向树的顶端寻找,直到找到一个节点P,P节点是其父节点Q的左边孩子(可参考例子2的前驱结点是1),那么Q就是该节点的后继节点

实现

  1. /**
  2. * 前驱元素
  3. * **/
  4. public BSTreeNode<T> Pred(BSTreeNode<T> node) {
  5. if (node.left != null) {
  6. return Max(node.left);
  7. }
  8. BSTreeNode<T> parent = node.parent;
  9. while (parent != null && node != parent.right) {
  10. node = parent;
  11. parent = node.parent;
  12. }
  13. return parent;
  14. }


  1. /**
  2. * 后继元素
  3. * **/
  4. public BSTreeNode<T> Succ(BSTreeNode<T> node) {
  5. if (node.right != null) {
  6. return Min(node.right);
  7. }
  8. BSTreeNode<T> parent = node.parent;
  9. while (parent != null && node != parent.left) {
  10. node = parent;
  11. parent = node.parent;
  12. }
  13. return parent;
  14. }






求二叉搜索树的前驱节点和后继节点

标签:otto   实现   jpg   最大   分享   int   order   null   back   

原文地址:http://www.cnblogs.com/xiejunzhao/p/f5f362c1a89da1663850df9fc4b80214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!