我已经实现了一个简单的二叉树程序,但是在遍历树时遇到一个问题,只能访问根元素。我怀疑节点未链接。我尽力找出问题所在,但是代码没有发现任何问题。
我在退出该功能之前尝试从插入功能打印数据,该功能确实可以正确打印数据。
public class BinaryTree {
Node root;
public void addNode(int data){
Node newNode = new Node(data);
if(root == null){
root = newNode;
}
else{
Node currentNode = root;
while(true){
if(data <= currentNode.data){
currentNode = currentNode.leftChild;
if(currentNode == null){
currentNode = newNode;
return;
}
}
else{
currentNode = currentNode.rightChild;
if(currentNode == null){
currentNode = newNode;
return;
}
}
}
}
}
public void inorderTraversal(Node currentNode){
if(currentNode != null){
inorderTraversal(currentNode.leftChild);
System.out.print(currentNode.data + " ");
inorderTraversal(currentNode.rightChild);
}
}
}
答案 0 :(得分:1)
实际上,您在递归步骤中没有将新节点正确地添加到树中。您应该使用的逻辑是,当到达一个节点,其左或右指针为null
,和时,该新节点属于该方向,则应将新节点添加到左还是右。否则,请继续遍历直到到达该节点。
while(true) {
if (data <= currentNode.data) {
if (currentNode.leftChild == null) {
currentNode.leftChild = newNode;
return;
}
else {
currentNode = currentNode.leftChild;
}
else {
if (currentNode.rightChild == null) {
currentNode.rightChild = newNode;
return;
}
else {
currentNode = currentNode.rightChild;
}
}
}
请记住,上述添加新节点的简单算法并不能保证一定会导致平衡的二叉树。为了确保这一点,您将不得不添加更多处理重新平衡的逻辑。
答案 1 :(得分:0)
您没有将元素分配给left
或right
子级。您只是将其分配给未链接到树的局部变量currentNode
。
按照下面的代码放入while
循环中,它应该对您有用。
if(data <= currentNode.data){
if(currentNode.leftChild == null){
currentNode.leftChild = newNode;
return;
}
else {
currentNode = currentNode.leftChild;
}
}
else{
if(currentNode.rightChild == null){
currentNode.rightChild = newNode;
return;
}
else {
currentNode = currentNode.rightChild;
}
}