二叉搜索樹的前驅節點和后繼節點


前驅結點:節點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. }







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM