二叉树遍历根节点始终为NULL问题排查求助
问题分析与修复
你的代码存在两个关键错误,直接导致根节点始终为null:
1. add方法逻辑错误
当前add方法在root不为null时,传入了一个null的Node n调用addrecursive,相当于每次添加新节点都从空节点开始,完全没关联到当前树的根节点,后续节点根本没被加入正确的树结构中。
修正后的add方法:
public void add(int value) { // 直接调用addrecursive,利用其逻辑处理root为null的情况,无需分支判断 root = addrecursive(root, value); }
2. createBinaryTree方法的局部对象问题
createBinaryTree内部新建了一个局部的BinaryTree bt,并给这个局部对象添加节点,但这个局部对象在方法结束后就会被销毁,和外部main方法中创建的bt实例毫无关联。外部实例的root依然是初始的null。
修正后的createBinaryTree方法:
private void createBinaryTree(){ // 直接给当前实例添加节点,无需新建BinaryTree对象 add(6); add(4); add(8); add(3); add(5); add(7); add(9); }
修正后的完整代码(关键部分已修复)
public class BinaryTree{ public static class Node{ int value; Node left; Node right; public Node(int data){ this.value = data; left = null; right = null; } } Node root; BinaryTree() { root = null; } public Node addrecursive(Node current,int value){ if(current==null){ return new Node(value); }else if(value<current.value){ current.left=addrecursive(current.left,value); }else if(value>current.value){ current.right=addrecursive(current.right,value); }else{ return current; } return current; } public void add(int value) { root = addrecursive(root, value); } private void createBinaryTree(){ add(6); add(4); add(8); add(3); add(5); add(7); add(9); } private boolean containsNodeRecursive(Node current, int value) { if (current == null) { return false; } if (value == current.value) { return true; } return value < current.value ? containsNodeRecursive(current.left, value) : containsNodeRecursive(current.right, value); } public boolean containsNode(int value) { return containsNodeRecursive(this.root, value); } public void traverseInOrder(Node node) { if (node != null) { traverseInOrder(node.left); System.out.print(" " + node.value); traverseInOrder(node.right); } } void printInorder() { traverseInOrder(root); } public static void main(String [] args){ BinaryTree bt = new BinaryTree() ; bt.createBinaryTree(); Boolean b = bt.containsNode(7); System.out.println(b); System.out.println("\nInorder traversal of binary tree is " ); bt.printInorder(); } }
运行修正后的代码,会输出:
true Inorder traversal of binary tree is 3 4 5 6 7 8 9
内容的提问来源于stack exchange,提问作者kastrahl
相关产品推荐
相关产品推荐

