方法功能介绍

TreeMap遍历算法属于二叉排序树范畴

  • 二叉树:
  • 二叉排序树参考:

根据二叉树前序遍历,假设遍历结果为,a、b、c、d;当前节点为c
那么前驱节点为b;后驱节点为d

对应方法分别如下

  • successor,寻找当前节点后驱节点
  • predecessor,寻找当前节点前驱节点

前序遍历算法:1. 左孩子;2. 节点;3. 右孩子

successor图解【寻找当前节点后驱节点】

  • CASE1,当前节点右孩子不为空【*前序遍历算法中当前节点为根节点,找右孩子

TreeMap 实现插入顺序 treemap顺序遍历_TreeMap 实现插入顺序


将当前节点(7)右孩子(10)当做子树(如图所示,看成一个整体),那么当前节点的后驱一定在这个子树中。找出子树最小节点(8)。

即:节点7的后驱为8

  • CASE2,当前节点右孩子为空【*前序遍历算法中当前节点为左孩子,找根节点

当前节点(7)作为左子树中一个结点,找出根节点(8)
即:节点7的后驱为8

下图也是CASE2场景

TreeMap 实现插入顺序 treemap顺序遍历_结点_02

predecessor图解【寻找当前节点前驱节点】

  • CASE3,当前节点左孩子不为空【*前序遍历算法中当前节点为根节点,找左孩子

TreeMap 实现插入顺序 treemap顺序遍历_前序遍历_03

将当前节点(7)左孩子(5)当做子树(如图所示,看成一个整体),那么当前节点的前驱一定在这个子树中。找出子树最大节点(6)。
即:节点7的后驱为8

  • CASE4,当前节点左孩子为空【*前序遍历算法中当前节点为右孩子,找根节点

当前节点(7)作为右子树中一个结点,找出根节点(2)
即:节点7的后驱为2

下图也是CASE4场景

TreeMap 实现插入顺序 treemap顺序遍历_结点_04

代码图形对应

对应图形查看代码即可,当前节点为入参t;代码非常简单,请查看

static <K,V> TreeMap.Entry<K,V> successor(Entry<K,V> t) {
    if (t == null)
        return null;
	// CASE1
    else if (t.right != null) {
        Entry<K,V> p = t.right;
        while (p.left != null)
            p = p.left;
        return p;
    } 
	// CASE2
	else {
        Entry<K,V> p = t.parent;
        Entry<K,V> ch = t;
        while (p != null && ch == p.right) {
            ch = p;
            p = p.parent;
        }
        return p;
    }
}


static <K,V> Entry<K,V> predecessor(Entry<K,V> t) {
    if (t == null)
        return null;
	// CASE3
    else if (t.left != null) {
        Entry<K,V> p = t.left;
        while (p.right != null)
            p = p.right;
        return p;
    } 
	// CASE4
	else {
        Entry<K,V> p = t.parent;
        Entry<K,V> ch = t;
        while (p != null && ch == p.left) {
            ch = p;
            p = p.parent;
        }
        return p;
    }
}