如何在二进制表达式树中查找值?

时间:2018-10-25 14:29:53

标签: java algorithm data-structures binary-tree

给出一棵树,例如:

enter image description here

我该怎么说呢?在那棵树中找到值apt up{date,grade}(无论哪个值3都没关系,但是找到后应该进行搜索)并可能将其更改为{ {1}}或其他一些数字,但是在那之后停止遍历树吗?我在网上找到的所有算法将始终遍历整棵树,或者当它们搜索特定值时会遍历整个BST,此处不适用。我不提供代码示例,因为我不知道从哪里开始这个问题。

3

2 个答案:

答案 0 :(得分:3)

首先,您需要一种算法来根据其值查找特定节点。可以通过按顺序,顺序或后序遍历树来轻松完成此操作(请参见Tree Traversal on Wikipedia,尤其是Implementation of Depth-first search)。如果找到该项目,则此算法从递归返回:

Node findNode(Node root, String value) {
    if (root == null) return null; // no such node
    if (value.equals(root.getValue())) return root; // the node itself contains the value

    Node n = findNode(root.getLeft(), value); // search left sub-tree
    if (n != null) return n; // we've found it in the left sub-tree

    return findNode(root.getRight(), value); // search right sub-tree
}

在那之后,很容易在树中交换一个值:

void exchange(Node root, String value, String newValue) {
    Node n = findNode(root, value);
    n.setValue(newValue);
}

当然,您也可以迭代遍历树,但是如果您没有非常大的树,则没有理由使用更简单的递归方法。

答案 1 :(得分:1)

根据您的需要,您将始终必须以顺序方式(例如在BFS或DFS中)开始从根元素(我假设您最初有权访问根)遍历树。由于您的树不是BST(或节点之间具有某些特殊关系的树),因此我们无法比对所有节点进行常规顺序搜索更快地搜索特定节点。

样本BFS伪代码;

Initialize Queue q;
q.add(root);

while(q is not empty){
    Node node = q.pop();

    if(Node equal to 3){ // or any value you want
        node.val = 7;
        return;
    }

    if(node.left!=null){q.add(node.left);}
    if(node.right!=null){q.add(node.right);}
}