为什么使用树形结构来支持搜索?

时间:2015-09-22 03:23:22

标签: java algorithm binary-search-tree

例如, public class BST<Key extends Comparable<Key>,Value> { private Node root; public class Node { private int n; private Node left; private Node right; private Key key; private Value val; } public void put(); public Value get(Key key) } 类使用树结构:

left

在此结构中,节点与rightput字段相关联,并且get和{{1}}方法支持插入和搜索。

我有兴趣知道

  • 如何创建节点?
  • 为什么要使用树形结构而不是数组或其他简单结构?

2 个答案:

答案 0 :(得分:0)

树结构搜索的关键优势是效率。与迭代数组相比,可以更快地到达与您要搜索的键匹配的节点(例如)。如果你有一个平衡的二叉树(即任何节点左右两侧的树的深度相差不超过1)的1024个项目,那么你需要逐步通过最多10个节点来找到密钥。数组的特殊情况(例如均匀分布的值)可以被有效地搜索,但树对于涉及比插入更多搜索的各种情况非常有用。

另一方面,将值插入树中可能效率低下,特别是由于需要重新平衡树以允许有效搜索(这是它们的主要目的)。这使得put方法相对复杂(取决于您使用的平衡算法)。

get方法非常简单:

public Value get(Key key) {
    Node node = root;
    while (node != null) {
        int compare = key.compareTo(node.key);
        if (compare > 0)
            node = node.right;
        else if (compare < 0)
            node = node.left;
        else
            return node.val;
    }
    return null;
}

答案 1 :(得分:0)

herehere解释得非常清楚。总结一下 - 这就是节点的创建方式。

    onInit : function() {
                            var that = this;
                            var oView = that.getView();
                            var mainPageTable = oView.byId("mainPageTable");
                             var oData = {
                                        root:{
                                            0: {
                                                name: "item1",
                                                enabled: true,
                                                0: {
                                                    name: "subitem1-1",
                                                    enabled: true,
                                                },
                                                1: {
                                                    name: "subitem1-2",
                                                    enabled: false,
                                                }
                                            },  
                                        }
                                };
    var oModel = new sap.ui.model.json.JSONModel();
                            oModel.setData(oData);
                            mainPageTable.setModel(oModel);
                            mainPageTable.bindRows("/root");
        }
});

如果密钥已经存在 - 它被替换,如果密钥是新的,则递归搜索直到搜索在叶子处结束 - 然后用新节点扩展叶子。重要的是要注意节点的最终位置是搜索最终找到它的位置,如果它已经在树中以便满足BST属性。

同样由于二进制搜索树的属性 - 搜索操作是O(log n)或O(h),其中n是节点数,h是树的高度。