当前位置: 首页 > 知识库问答 >
问题:

如何得到无序二叉搜索树中节点的左右子节点?

严书
2023-03-14

我遇到了这个问题:下面的方法必须返回左侧子节点中的值,或者-1(如果它不存在)。

public int getLeftChild(int el) {...}
/* Same for the right child */

现在,参数是一个int值,它指示父节点的值。另一个问题是...树不是有序的,只有正整数值。所以,我可以在根中有一个0的值,在左边的子项中有3的值,在右边的子项中有1的值,以此类推...我想不出该怎么解决这件事。我不能将像LinkedList或Stack这样的ADT用于任何目的。二叉树类有一个字段根,类型为node:

public class Node {
    private int value;
    private Node leftChild;
    private Node rightChild;
    /*Getters and Setters...*/
}

共有1个答案

孔鹤龄
2023-03-14

类似这样的方法会起作用:

public int getLeftChild(int el) {
    int not_found = -1;
    Stack<Node> nodes_to_search = new Stack<>();
    nodes_to_search.add(this);

    while(!stack.isEmpty()){
        Node root = nodes_to_search.pop();
        if(root.value == el){
            return (root.leftChild != null) ? root.leftChild.value  : not_found;
        }
        if(root.leftChild != null)   nodes_to_search.push(root.leftChild);
        if(root.rightChild != null)  nodes_to_search.push(root.rightChild);
    }
    return not_found;
}

您必须在子树中进行搜索,因为树没有排序。每次找到一个有效的子树(即,不是null),就添加到元素堆栈中进行搜索。在满足搜索条件时停止搜索。

 类似资料:
  • 问题内容: 我想在非二叉树中搜索一个项目(任何节点都可以有n个孩子)并立即退出递归。所讨论的节点可以是任何节点,而不仅仅是叶子。 这是我的代码,但我没有完整的搜索。 nNode包含: (是孩子) 和数据对象。 问题答案: 探索第一个孩子后,您不应该退出。您不需要循环前面的语句。

  • 当删除具有两个子节点的节点时,如果指示使用标准的二叉搜索树节点删除算法,我们应该将其替换为右子树的最小节点还是左子树的最大节点?

  • 我需要得到所有节点的x,y坐标,例如: X:使用顺序遍历访问节点之前已经访问的节点数 Y:节点从根开始的深度 例如对于节点15,x=5(15之前:已经访问过7, 8, 9, 10, 13),y=1(第二级) 树没有父指针 结果:x是错误的,y是正确的 打印: 结果: 我已经尝试过了(我认为这是不正确的,因为正确的子树遍历不计入节点) 结果是

  • 在“二叉树”中,一个外部节点是一个没有任何子节点的节点,无论是左的还是右的,如果我错了,请纠正我-在“二叉树”中,一个外部节点总是空的,因为根据我的课堂讲稿,一个内部节点总是有两个子节点,即使没有创建,但我们假设该内部节点的子节点是空的。那么,如果外部节点为空,我如何访问它呢? 我将这段代码作为BST节点类的一部分编写: Last方法给我nullPointerException

  • 我需要创建一个递归方法,它将二进制搜索树的根节点作为参数。这个递归方法随后将返回整个二叉搜索树中节点总数的int值。 这是我目前所掌握的: main方法调用节点如下所示: 所以我是按顺序运行搜索的,一旦我到达一个没有子节点的节点,我就会删除当前节点,返回父节点并继续。我对上面的方法进行了调试,当程序最终计数并删除根节点左右两侧的所有节点并尝试返回1时,程序以NullPointerException

  • 我的任务是计算每个节点的深度,并将其存储在Node类中给出的“深度”中。但是我不知道我应该如何处理这个任务。我在互联网上寻找一些示例,但没有找到任何适合我的任务的示例。这是我给定的Node类的代码: 我以为我可以用类似的方法来计算树的高度,但是没有成功。有帮助吗?