Java 如何将二进制搜索树中的每个节点存储在列表中?

Java 如何将二进制搜索树中的每个节点存储在列表中?,java,list,data-structures,binary-tree,binary-search-tree,Java,List,Data Structures,Binary Tree,Binary Search Tree,我正在尝试在二元搜索树类中编写一个函数,该函数将返回树中值大于n的节点数,格式为public int-bether(int-n)。我认为将所有值存储在一个列表中,然后在列表上迭代,每次发现一个数字大于n时递增计数可能会更容易。我将如何着手实施这一点 这是我目前的课程: public class BST { private BTNode<Integer> root; private int count = 0; List<Integer> arr = new

我正在尝试在二元搜索树类中编写一个函数,该函数将返回树中值大于n的节点数,格式为
public int-bether(int-n)
。我认为将所有值存储在一个列表中,然后在列表上迭代,每次发现一个数字大于n时递增计数可能会更容易。我将如何着手实施这一点

这是我目前的课程:

public class BST
{ private BTNode<Integer> root;
    private int count = 0;
    List<Integer> arr = new ArrayList<>();
    private BST right = new BST();
    private BST left = new BST();

    public BST()
  { root = null;
  }

  public boolean find(Integer i)
  { BTNode<Integer> n = root;
    boolean found = false;

    while (n!=null && !found)
    { int comp = i.compareTo(n.data);
      if (comp==0)
        found = true;
      else if (comp<0)
        n = n.left;
      else
        n = n.right;
    }

    return found;
  }

  public boolean insert(Integer i)
  { BTNode<Integer> parent = root, child = root;
    boolean goneLeft = false;

    while (child!=null && i.compareTo(child.data)!=0)
    { parent = child;
      if (i.compareTo(child.data)<0)
      { child = child.left;
        goneLeft = true;
      }
      else
      { child = child.right;
        goneLeft = false;
      }
    }

    if (child!=null)
      return false;  // number already present
    else
    { BTNode<Integer> leaf = new BTNode<Integer>(i);
      if (parent==null) // tree was empty
        root = leaf;
      else if (goneLeft)
        parent.left = leaf;
      else
        parent.right = leaf;
      return true;
    }
  }

  public int greater(int n){ //TODO
      return 0;
  }
}

class BTNode<T>
{ T data;
  BTNode<T> left, right;

  BTNode(T o)
  { data = o; left = right = null;
  }
}
公共类BST
{私有节点根;
私有整数计数=0;
List arr=new ArrayList();
私有BST权限=新BST();
私有BST left=新BST();
公共BST()
{root=null;
}
公共布尔查找(整数i)
{BTNode n=根;
布尔值=false;
while(n!=null&&!找到)
{int comp=i.compareTo(n.data);
如果(comp==0)
发现=真;

否则如果(comp我将不使用列表作为临时存储

有一个概念称为允许您访问树的每个节点

下面是一些伪代码:

preorder(node)
  if (node = null)
    return
  visit(node)
  preorder(node.left)
  preorder(node.right)
此处的
visit
功能在每个节点上执行一次。 对于像您描述的计数这样的专门遍历,您可以使用所需的功能替换
visit
,例如:

if (node.data > n) {
    count += 1
}
如果实现一个
Preorder
类,则更好,您可以对该类进行扩展,为其提供自定义访问功能