当我在二叉搜索树中实现插入和打印时。它只打印出第一个根节点。请帮忙为什么?二进制搜索树的基本实现,从学习它们开始,然后转向使用它们的更高级的东西,但在第一步磕磕绊绊。看起来它没有将节点添加到根节点。
class bstrees{
class Node
{
int data;
Node left;
Node right;
public Node(int data)
{
this.data=data;
this.left=null;
this.right=null;
}
}
Node root;
bstrees(){root=null;}
public void insert(int data){
root=insert_node(root,data);
}
public Node insert_node(Node r,int n){
if(r==null){
Node n1=new Node(n);
//root=n1;
return n1 ;
}
else if(root.data<=n){
insert_node(root.right,n);
}
else{
insert_node(root.left,n);
}
return r;
}
public void print_t(){
print_t(root);
}
private void print_t(Node r){
//System.out.println(r);
if(r!=null){
// System.out.println(r.left);
// System.out.println(r.right);
print_t(r.left);
System.out.println(r.data+" ");
print_t(r.right);
}
}
}
public class BST_prac {
public static void main(String[] args) {
// TODO Auto-generated method stub
bstrees b1=new bstrees();
b1.insert(5);
b1.insert(1);
b1.print_t();
}
}
只打印出5个。
答案 0 :(得分:3)
在将值1
插入树中的调用中,对insert_node(root.left,n)
的调用会创建一个新节点,但不会存储对此新创建节点的引用,这意味着树本身就是有效的没有改变。引用应存储在新创建的节点的父节点中;这同样适用于将节点插入到右子树中。
答案 1 :(得分:0)
当您插入Codor所提到的新节点时,您不会存储父节点的引用,例如是否要添加到左节点或右节点。总是在创建新节点。我在插入方法中使代码工作时做了一点改动。
public void insert(int data){
//creating root node if root node itself is null
if(root==null){
root =new Node(data);
} else {
root=insert_node(root, data, null, null);
}
//System.out.println("after insert root data is " + root.data);
}
public Node insert_node(Node node, int n, String dir, Node parent){
//traverse and insert in proper nodes
//assign left or right child based on some logic i have taken direction as string here.
if(node == null) {
Node n1 = new Node(n);
if(dir.equalsIgnoreCase("left")) {
parent.left = n1;
} else {
parent.right = n1;
}
}
else if(root.data<=n){
parent = root;
insert_node(root.right, n, "right", parent);
}
else{
parent = root;
insert_node(root.left, n, "left", parent);
}
return root;
}