菜单驱动 Java 实现二进制搜索树的程序。无法获得树结构以在根之外添加节点(插入功能)
Menu Driven Java Program to implement Binary Search Tree. Cant get the Tree structure to add nodes beyond the root (insert function)
除了根之外,我无法永久添加更多节点。一旦在插入函数中创建了一个树对象,在下一次进入插入函数时它就会被取消,所以只有根存在。我找不到问题,这让我发疯。有人请帮忙,如果你使用我在这段代码中使用的相同数据结构会更好。
import java.util.Scanner;
class tree
{
int x;
tree left=null;
tree right=null;
}
class bst28
{
public static tree root=null;
public static void main(String[] args)
{
bst28 bl=new bst28();
int ch,y;
Scanner scn=new Scanner(System.in);
do{
System.out.println("Menu:\n1.Insert\n2.Search"); System.out.println("\n3.In-order-traversal\n4..Exit:");
ch=scn.nextInt();
switch(ch)
{
case 1:System.out.println("Enter the element to insert :");
y=scn.nextInt();
bl.insert(y);
break;
case 2:System.out.println("Enter the element to search for :");
y=scn.nextInt();
bl.search(y);
break;
case 3: bl.inorder(bl.root);
break;
default:break;
}
}while(ch!=4);
}
void insert(int a)
{
tree temp=new tree();
temp.x=a;
boolean val=true;
if(root==null)
{
root=new tree();
root=temp;
return;
}
System.out.println(root.x);
tree current=new tree();
current=root;
while(val)
{
if(a<current.x)
{ System.out.println(current.x);
System.out.println("Trav to left");
current=current.left;
if(current==null)
{
System.out.println("Node currently null");
current=new tree();
current=temp;
System.out.println("Entered left of a node");
System.out.println(current.x);
val=false;
}
}
else if(a>current.x)
{
System.out.println("Trav to right");
current=current.right;
if(current==null)
{
System.out.println("Node currently null");
current=new tree();
current=temp;
System.out.println("Entered right of a node");
System.out.println(current.x);
val=false;
}
}
else
{
System.out.println("Value exists in the tree\n");
val=false;
}
}
}
void search(int a)
{
if(root==null)
{
System.out.println("Empty tree !");
return;
}
tree current=new tree();
current=root;
while(current!=null)
{
if(a==current.x)
{
System.out.println("FOund !");
return;
}
else if(a<current.x)
{
current=current.left;
}
else
{
current=current.right;
}
}
System.out.println("Not Found !");
}
void inorder(tree temp)
{
if(temp!=null)
{
inorder(temp.left);
System.out.println("Visited node :"+temp.x);
inorder(temp.right);
}
}
}`
您没有将新子树(我们称它为 "node",因为它只包含 1 个元素)与现有树相关联。您正在创建节点,向下移动树,当您发现当前节点为空时,将新节点关联到当前节点。您必须保持领先一步,这意味着:在向下移动树(向左或向右)之前检查 (left/right) 子树是否为空并采取相应行动。
所以,代码:
if(a<current.x)
{ System.out.println(current.x);
System.out.println("Trav to left");
current=current.left;
if(current==null)
{
System.out.println("Node currently null");
current=new tree();
current=temp;
System.out.println("Entered left of a node");
System.out.println(current.x);
val=false;
}
}
变成这样(我没有运行代码,所以测试一下):
if(a<current.x)
{ System.out.println(current.x);
System.out.println("Trav to left");
if(current.left!=null)
{
current=current.left;
System.out.println("Entered left of a node");
System.out.println(current.x);
}
else
{
System.out.println("Node currently null");
current.left=temp;
val=false;
}
}
另一种情况也必须这样做。
除了根之外,我无法永久添加更多节点。一旦在插入函数中创建了一个树对象,在下一次进入插入函数时它就会被取消,所以只有根存在。我找不到问题,这让我发疯。有人请帮忙,如果你使用我在这段代码中使用的相同数据结构会更好。
import java.util.Scanner;
class tree
{
int x;
tree left=null;
tree right=null;
}
class bst28
{
public static tree root=null;
public static void main(String[] args)
{
bst28 bl=new bst28();
int ch,y;
Scanner scn=new Scanner(System.in);
do{
System.out.println("Menu:\n1.Insert\n2.Search"); System.out.println("\n3.In-order-traversal\n4..Exit:");
ch=scn.nextInt();
switch(ch)
{
case 1:System.out.println("Enter the element to insert :");
y=scn.nextInt();
bl.insert(y);
break;
case 2:System.out.println("Enter the element to search for :");
y=scn.nextInt();
bl.search(y);
break;
case 3: bl.inorder(bl.root);
break;
default:break;
}
}while(ch!=4);
}
void insert(int a)
{
tree temp=new tree();
temp.x=a;
boolean val=true;
if(root==null)
{
root=new tree();
root=temp;
return;
}
System.out.println(root.x);
tree current=new tree();
current=root;
while(val)
{
if(a<current.x)
{ System.out.println(current.x);
System.out.println("Trav to left");
current=current.left;
if(current==null)
{
System.out.println("Node currently null");
current=new tree();
current=temp;
System.out.println("Entered left of a node");
System.out.println(current.x);
val=false;
}
}
else if(a>current.x)
{
System.out.println("Trav to right");
current=current.right;
if(current==null)
{
System.out.println("Node currently null");
current=new tree();
current=temp;
System.out.println("Entered right of a node");
System.out.println(current.x);
val=false;
}
}
else
{
System.out.println("Value exists in the tree\n");
val=false;
}
}
}
void search(int a)
{
if(root==null)
{
System.out.println("Empty tree !");
return;
}
tree current=new tree();
current=root;
while(current!=null)
{
if(a==current.x)
{
System.out.println("FOund !");
return;
}
else if(a<current.x)
{
current=current.left;
}
else
{
current=current.right;
}
}
System.out.println("Not Found !");
}
void inorder(tree temp)
{
if(temp!=null)
{
inorder(temp.left);
System.out.println("Visited node :"+temp.x);
inorder(temp.right);
}
}
}`
您没有将新子树(我们称它为 "node",因为它只包含 1 个元素)与现有树相关联。您正在创建节点,向下移动树,当您发现当前节点为空时,将新节点关联到当前节点。您必须保持领先一步,这意味着:在向下移动树(向左或向右)之前检查 (left/right) 子树是否为空并采取相应行动。 所以,代码:
if(a<current.x)
{ System.out.println(current.x);
System.out.println("Trav to left");
current=current.left;
if(current==null)
{
System.out.println("Node currently null");
current=new tree();
current=temp;
System.out.println("Entered left of a node");
System.out.println(current.x);
val=false;
}
}
变成这样(我没有运行代码,所以测试一下):
if(a<current.x)
{ System.out.println(current.x);
System.out.println("Trav to left");
if(current.left!=null)
{
current=current.left;
System.out.println("Entered left of a node");
System.out.println(current.x);
}
else
{
System.out.println("Node currently null");
current.left=temp;
val=false;
}
}
另一种情况也必须这样做。