使用BST插入法查询进行升序和降序排序

Ascending and descending sorting using BST insert method query

我想按紧急数据字段的降序向 BST 中插入一个新对象 newPat 作为二进制节点。我正在按升序执行以下代码。如何将其更改为降序?

英国夏令时 class:

public void insertPatient(Patient newPat)
{
    BNode temp = new BNode(newPat);
    root = insert(root, temp);
}


protected BNode insert(BNode rt, BNode newNode)
{
    //attach newnode to correct subtree keeping ascending order and returns pointer to the node which it was called
    if(rt == null){
        rt = newNode; //last node becomes root           
    }else 
    {
        if((newNode.obj.getKey().compareTo(rt.obj.getKey()) < 0))
        {
            rt.left = insert (rt.left, newNode);
        } 
        else 
        {
            rt.right = insert (rt.right, newNode);
        }
    }
    return rt;
}
  1. 在二叉搜索树中(按照常识),root 不会是最小值或最大值(除非您的插入顺序确保或执行轮换来管理 属性。在这种情况下, 它会有最坏情况的时间复杂度)
  2. 如果您总是需要最小值或最大值,请尝试查看 Binomial Heap

根据作者的说明更新

由于现有代码将 lesser 值插入 left 子树并将 bigger 值插入右子树,因此将 < 更改为 >= 应该解决您的用例。

    protected BNode insert(BNode parent, BNode newNode) {
        if (parent == null) {
            return newNode;
        }
        if (newNode.obj.getKey().compareTo(parent.obj.getKey()) >= 0) {
            parent.left = insert (parent.left, newNode);
        } else {
            parent.right = insert (parent.right, newNode);
        }
        return parent;
    }

使用 descending 的这个新 属性,确保将您的搜索功能也从 < 更新到 >=。否则插入将起作用并且搜索将无法识别该节点。

建议

或者,插入顺序可以保持不变,检索逻辑可以更改为遍历 (ascending) 树,从 rightleft 以获得相同的行为。

保持现有代码用于插入(< 比较)

    protected List<Patient> descendingInorder(BNode node, List<Patient> values) {
        if (node == null) {
            return values;
        }
        descendingInorder(node.right, values);
        values.add(node.obj);
        descendingInorder(node.left, values);
        return values;
    }

备注

  1. 如果树可以包含重复项,则确保为其定义行为。