我在弄清楚如何在我的二叉搜索树中添加或插入节点时遇到了一些麻烦。目前我有以下代码:
public void add(int v) {
Node n = new Node(v);
if(root==null)
root = n;
else {
Node m = root;
while(...) { //not sure what to check
if(v < m.value)
m = m.left;
else
m = m.right;
}
if(...) //not sure what to check
m.left = n;
else
m.right = n;
}
}
然后我还想在一定范围内生成n个节点。我知道如何为数组执行此操作,但我不确定如何为BST中的节点进行此操作。
public void generate(int n, int range) {
}
答案 0 :(得分:1)
当您插入二叉树时,您想要找到一个没有相应子节点的节点。然后,将新节点插入该位置。
至于填充范围中的数字,您可以按照与数组相同的方式生成它们,但不是插入数组,而是add
方法。
答案 1 :(得分:0)
使用您当前的方法,您需要一个额外的变量来跟踪父Node
public void add(int v) {
Node n = new Node(v);
if(root==null)
root = n;
else {
Node m = root,k;
while(m!=null) {
if(v < m.value){
k=m;
m = m.left;
}
else if(v > m.value){
k=m;
m = m.right;
}else{
return; //v already exists
}
}
if(v < k.value)
k.left=n;
else
k.right=n;
}
}
<小时/> 关于范围的第二个问题,正如DrYap指出的那样,生成一个范围内的数字,并为每个数字调用add()
答案 2 :(得分:0)
向BST添加值时,您横向树,直到找到空白点并在该位置插入新节点。
首先,我们从退化案例开始。即,没有节点,root为null / empty。
伪代码:
if root is null then
root = new node(value);
return;
end if
所以,我们在这里所做的就是构建树的根节点。它不包含叶节点。
现在所有后续插入都需要我们横向树。
首先,我们需要一个起点,它将成为根节点。然后我们还需要知道我们是否已到达一个空位,我们可以将新值插入树中。这需要跟踪两个变量;一个用于保存我们正在检查的当前节点,另一个用于保存该节点的父节点。
伪码:
# initialize tracking variables.
checkNode = root;
parentNode = checkNode;
while checkNode is null do
parent = checkNode; # want to save this for when we find a spot to store our new value
if valueOf(checkNode) equals value then return # the value is already stored
if value < valueOf(checkNode) then
# the new value is less than the value stored in this node so continue down the left branch
checkNode = checkNode.left
else
checkNode = checkNode.right # otherwise continue down the right branch
end while
# at this point checkNode will be null and parent will be set to a node that can store a new node with our value.
if value < valueOf(parent) then
parent.left = node(value) # store a new node in the left of the found parent node
else
parent.right = node(value)
我们正在做的是横向树,比较要添加到我们正在检查的节点的值的值。我们还跟踪我们正在检查的节点的父节点,因为这是我们最终将最终插入新节点的地方。这是因为我们在checkNode为空时结束搜索。