【问题标题】:Ascending and descending sorting using BST insert method query使用 BST 插入方法查询的升序和降序排序
【发布时间】:2021-02-01 19:51:30
【问题描述】:

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

BST 类:

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;
}

【问题讨论】:

    标签: java binary-search-tree nodes


    【解决方案1】:
    1. 在二叉搜索树中(根据常识),root 不会是最小值或最大值(除非您的插入顺序确保或执行轮换来管理属性。在这种情况下,它将具有最坏情况的时间复杂度)
    2. 如果您总是需要最小值或最大值,请尝试查看Binomial Heap

    根据作者的说明更新

    由于现有代码将lesser 值插入left 子树并将bigger 值插入右子树,将&lt; 更改为&gt;= 应该可以解决您的用例。

        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 的这个新属性,确保将您的搜索功能也从&lt; 更新为&gt;=。否则插入将起作用,搜索将无法识别节点。

    建议

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

    保留现有代码以供插入(&lt; 比较)

        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. 如果树可以包含、重复,则确保为此定义行为。

    【讨论】:

    • 谢谢您,您对我的描述非常好,我非常感谢您的解释,祝您有美好的一天
    • 很高兴能提供帮助。也谢谢你。我鼓励您在 SO 中提出问题之前尝试几种不同的方法。从长远来看,它将对您有所帮助。这只是一个建议,并不是要阻止您提出问题。再见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2019-10-03
    • 1970-01-01
    • 2012-11-08
    • 2023-03-07
    相关资源
    最近更新 更多