class Student
{
String name;
int roll;
int age;
public Student(String n,int r,int a) {
name=n;
roll=r;
age=a;
}
public String retname() {
return name;
}
public int retroll() {
return roll;
}
public int retage() {
return age;
}
public void displaystudent() {
System.out.print("Name : "+name+" Roll : "+roll+" Age : "+age+"\n");
}
}
class Node
{
Student s;
Node lchild;
Node rchild;
public Node(String n,int r ,int a) {
s=new Student(n,r,a);
}
public void displayNode() {
s.displaystudent();
}
}
class Tree
{
public Node root;
public void insert(String n,int r,int a) {
Node newNode=new Node(n,r,a);
if(root==null)
root=newNode;
else {
Node current=root;
Node parent;
while(true) {
parent=current;
if(n.compareTo(current.s.retname())<0) {
current=current.lchild;
if(current==null)
parent.lchild=newNode;
return;
} else {
current=current.rchild;
if(current==null)
parent.rchild=newNode;
return;
}
}
}
}
public void order() {
inorder(root);
preorder(root);
postorder(root);
}
public void inorder(Node localroot) {
if(localroot!=null) {
inorder(localroot.lchild);
localroot.displayNode();
inorder(localroot.rchild);
}
}
public void preorder(Node localroot) {
if(localroot!=null) {
preorder(localroot.lchild);
preorder(localroot.rchild);
localroot.displayNode();
}
}
public void postorder(Node localroot) {
if(localroot!=null) {
localroot.displayNode();
postorder(localroot.lchild);
postorder(localroot.rchild);
}
}
}
class e
{
public static void main(String [] args) { //throws IOException
Tree t=new Tree();
t.insert("E",1,23);
t.insert("D",2,2);
t.insert("C",3,4);
t.insert("B",4,89);
t.insert("A",5,45);
t.order();
}
}
上面的代码没有显示它应该的所有输出。另外,为什么预购和顺序给出相同的结果? 另外,如何在不从根开始的子树中进行遍历? 有没有办法避免递归?
这是当前不正确的输出。它应该按照特定的顺序打印我插入的所有元素。
Name : D Roll : 2 Age : 2
Name : E Roll : 1 Age : 23
Name : D Roll : 2 Age : 2
Name : E Roll : 1 Age : 23
Name : E Roll : 1 Age : 23
Name : D Roll : 2 Age : 2
答案 0 :(得分:0)
我注意到的最明显和第一个问题是你的insert
方法。在此方法中,您始终在检查while循环的下一次迭代之前返回(如果根具有子子节点,则不会插入任何内容)。要解决此错误,只需像这样更改while循环:
while(true)
{
parent=current; //assign parent to root
if(n.compareTo(current.s.retname())<0)
{
current=current.lchild;
if(current==null) {//added brackets so the return only happened when this was true
parent.lchild=newNode;
return;
}
}
else
{
current=current.rchild;
if(current==null){ //added brackets so the return only happened when this was true
parent.rchild=newNode;
return;
}
}
}
进行这些更改后,您可以自行回答其他问题。进行这些更改,看看它是否解决了您的问题,如果没有评论让我知道,我会再看看。
编辑一个:
我认为你的预购错了。我相信你应该在之前打印节点分别以递归方式遍历左右子节点。它应该是这样的:
public void preorder(Node localroot) {
if(localroot!=null) {
localroot.displayNode(); //here!
preorder(localroot.lchild);
preorder(localroot.rchild);
//localroot.displayNode(); not here!
}
}