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

从二叉树构建BST的最佳实践

井高峯
2023-03-14

我正在用Java创建一个二叉搜索树,它是从一个已经实现的二叉树扩展而来的,但是当我尝试使用一些继承的方法时,它不起作用。让我解释一下:

二叉树

public class BinaryTree<T>{
     private Node<T> root;

     public class Node<T>{
          T value;
          Node left;
          Node right;

          public Node(T value){
               this.value = value;
               this.left = null;
               this.right = null;
          }
     }
     
     public BinaryTree(){
          ...
     }
     public void printInOrder(){
          ...
     }  
 }

英国夏令时:

public class BST extends BinaryTree<Integer>{
      private Node<Integer> root;

      public BST(Integer v){
          super(v);
      }

      public void insert(Integer element){
            insert(this.root, element);
      }

      private insert( Node node, Integer element){
            if(node == null)
               return;
        
            if(node.value > value) {
                  if(node.left != null) {
                       insert(node.left, value);
                  }
                  else {
                       node.left = new NodeBST(value);
                  }
             }else { // Node.value < element
                 if(node.right != null) {
                      insert(node.right, value);
                 }
                 else {
                      node.right = new NodeBST(value);
                 }
             }

         }

   }

应用程序:

public class App{

      public static void main(String[] args){
             BST bst = new BST(4);
             bst.insert(2);
             bst.insert(5);
             bst.insert(3);
             bst.insert(7);

             bst.printInOrder();  //Here I got the problem

     }
}

如果我尝试打印它,它将只打印根(4),其余节点将为空。当我看看里面发生了什么,结果发现有两个根源:

  • BST. Node根,其中包含按正确顺序排列的所有节点
  • BinaryTree。节点根,仅包含根,所有其他节点均为空。

所以我猜它正确地创建了根,因为我在BST的构造函数中调用了超类,但是当我在insert方法中创建一个新节点时,它只在BST.Node root中追加它(而不是在BinaryTree.Node root中),因此当我在prints null中从BST调用print(在BinaryTree中实现)时:/

所以我的问题是:

  • 如何从BST使用print方法来打印BST.Node root中的所有值
  • 什么可以阻止BinaryTree。节点根与BST相同。节点根
  • 这样做的最佳做法是什么

共有1个答案

邰博远
2023-03-14

不要在BST中再次声明“root”,它会在基类中隐藏“root”。

要么在BinaryTree中保护“root”,要么在那里提供必要的访问器,这样子类就可以使用它。

 类似资料:
  • 二叉树 : 闲话少说,直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BST</title> </head> <body> <script> //结点 function Node(data,left,right){ this.data=data; t

  • 这里有问题 二叉搜索树(BST)是一种二叉树,其中每个节点的值大于或等于该节点左子树中所有节点的值,而小于该节点右子树中所有节点的值。 编写一个函数,根据使用的时间有效地检查给定的二叉搜索树是否包含给定的值。

  • 我有一个二进制搜索树,它的每个节点都有两个值。 所以它的节点是这样的。 我已经根据节点的“name”变量的升序在BST中插入了值。所以树的顺序遍历将按“name”的升序返回节点。 现在我想根据“值”变量的升序显示树节点。无需更改原始树。哪种算法/方法对此最有效?

  • 如果二叉树是使用递归的bst,我正在尝试编写一个bool函数来返回true,我需要一些关于haskell语法的指导。 我知道要使二叉树成为 bst,左侧子树必须始终仅包含小于头部的节点。并且右侧子树必须始终仅包含大于头部的节点。我正在这样构建我的函数: 但是此代码会导致错误: 无法将预期类型“Bool”与实际类型“Int”匹配 参考

  • 编写一个函数,如果给定的二叉搜索树包含给定的值,则返回1,否则返回0。 例如,对于以下树: N1(值:1,左:null,右:null) n2(值:2,左:n1,右:n3) N3(值:3,左:null,右:null) 对contains(&n2,3)的调用应返回1,因为根位于n2的树包含编号3。 函数应该返回1,然而,它返回0或者根本不返回。

  • 本文向大家介绍Python3实现二叉树的最大深度,包括了Python3实现二叉树的最大深度的使用技巧和注意事项,需要的朋友参考一下 问题提出: 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 解决思路:递归法求解。从根结点向下遍历,每遍历到子节点depth+1。 代码实现( ̄▽ ̄): 时间和空间消耗: 以上就是本文的