Java二叉树。按序遍历打印
我在打印二叉树的有序遍历时遇到一些问题。即使在树中插入了许多项,它也只打印了3项Java二叉树。按序遍历打印,java,binary-tree,tree-traversal,inorder,Java,Binary Tree,Tree Traversal,Inorder,我在打印二叉树的有序遍历时遇到一些问题。即使在树中插入了许多项,它也只打印了3项 public class BinaryTree { private TreeNode root; private int size; public BinaryTree(){ this.size = 0; } public boolean insert(TreeNode node){ if( root == null)
public class BinaryTree {
private TreeNode root;
private int size;
public BinaryTree(){
this.size = 0;
}
public boolean insert(TreeNode node){
if( root == null)
root = node;
else{
TreeNode parent = null;
TreeNode current = root;
while( current != null){
if( node.getData().getValue().compareTo(current.getData().getValue()) <0){
parent = current;
current = current.getLeft();
}
else if( node.getData().getValue().compareTo(current.getData().getValue()) >0){
parent = current;
current = current.getRight();
}
else
return false;
if(node.getData().getValue().compareTo(parent.getData().getValue()) < 0)
parent.setLeft(node);
else
parent.setRight(node);
}
}
size++;
return true;
}
/**
*
*/
public void inOrder(){
inOrder(root);
}
private void inOrder(TreeNode root){
if( root.getLeft() !=null)
this.inOrder(root.getLeft());
System.out.println(root.getData().getValue());
if( root.getRight() != null)
this.inOrder(root.getRight());
}
}
公共类二进制树{
独活根;
私有整数大小;
公共二叉树(){
此值为0.size=0;
}
公共布尔插入(TreeNode节点){
if(root==null)
根=节点;
否则{
TreeNode父节点=null;
TreeNode电流=根;
while(当前!=null){
if(node.getData().getValue().compareTo(current.getData().getValue())0){
父项=当前;
current=current.getRight();
}
其他的
返回false;
if(node.getData().getValue().compareTo(parent.getData().getValue())<0)
setLeft(节点);
其他的
setRight(节点);
}
}
大小++;
返回true;
}
/**
*
*/
公共无效序(){
顺序(根);
}
私有void索引(树节点根){
if(root.getLeft()!=null)
this.inoorder(root.getLeft());
System.out.println(root.getData().getValue());
if(root.getRight()!=null)
this.inoorder(root.getRight());
}
}
您插入的方法有问题。它找到了要将新元素附加到的正确父节点,但在这个过程中,它会弄乱整个树。您应该将插入代码移出while循环:
public boolean insert(TreeNode node){
if( root == null)
root = node;
else{
TreeNode parent = null;
TreeNode current = root;
while( current != null){
if( node.getData().getValue().compareTo(current.getData().getValue()) <0){
parent = current;
current = current.getLeft();
}
else if( node.getData().getValue().compareTo(current.getData().getValue()) >0){
parent = current;
current = current.getRight();
}
else
return false;
}
if(node.getData().getValue().compareTo(parent.getData().getValue()) < 0)
parent.setLeft(node);
else
parent.setRight(node);
}
size++;
return true;
}
}
公共布尔插入(TreeNode节点){
if(root==null)
根=节点;
否则{
TreeNode父节点=null;
TreeNode电流=根;
while(当前!=null){
if(node.getData().getValue().compareTo(current.getData().getValue())0){
父项=当前;
current=current.getRight();
}
其他的
返回false;
}
if(node.getData().getValue().compareTo(parent.getData().getValue())<0)
setLeft(节点);
其他的
setRight(节点);
}
大小++;
返回true;
}
}
在插入时,您似乎没有正确地遍历树,以找到新节点的正确位置。现在,您总是在根的一个子级插入,因为插入代码在while
循环中-它应该在它之后:
公共布尔插入(TreeNode节点){
if(root==null)
根=节点;
否则{
TreeNode父节点=null;
TreeNode电流=根;
while(当前!=null){
if(node.getData().getValue().compareTo(current.getData().getValue())0){
父项=当前;
current=current.getRight();
}
其他的
返回false;
}
if(node.getData().getValue().compareTo(parent.getData().getValue())<0)
setLeft(节点);
其他的
setRight(节点);
}
大小++;
返回true;
}
嘿,伙计们,这里有一个简单的例子。。试试这个。。这对我很有效
public void levelOrderTraversal(Node root){
Queue<Node> queue = new ArrayDeque<Node>();
if(root == null) {
return;
}
Node tempNode = root;
while(tempNode != null) {
System.out.print(tempNode.data + " ");
if(tempNode.left != null) queue.add(tempNode.left);
if(tempNode.right != null) queue.add(tempNode.right);
tempNode = queue.poll();
}
}
public void levelOrderTraversal(节点根){
Queue Queue=new ArrayDeque();
if(root==null){
返回;
}
Node tempNode=root;
while(tempNode!=null){
System.out.print(tempNode.data+“”);
if(tempNode.left!=null)queue.add(tempNode.left);
if(tempNode.right!=null)queue.add(tempNode.right);
tempNode=queue.poll();
}
}
我想你可以称之为hw。我正在测试二叉树,有序遍历可能是其中一个问题。我只是想复习一下,我强烈建议你不要在类也有一个字段“root”时,使用一个参数“root”的方法。这让事情变得非常混乱。在Justin的评论之后,我认为您应该使用inOrder(..)一个静态方法。它与特定的树实例无关。实际上,顺序方法体似乎很好。也许你应该检查一下你的插入物。
public void levelOrderTraversal(Node root){
Queue<Node> queue = new ArrayDeque<Node>();
if(root == null) {
return;
}
Node tempNode = root;
while(tempNode != null) {
System.out.print(tempNode.data + " ");
if(tempNode.left != null) queue.add(tempNode.left);
if(tempNode.right != null) queue.add(tempNode.right);
tempNode = queue.poll();
}
}