二叉树的实现赋值不成功

Awin_chen 2017-11-12 04:07:07
package collections;

import java.util.Comparator;
/**
* 一般对于集合,使用泛型是一个很好的安全防护措施,相比较于Object,能够
* 约束使用者只能传递入单一类型的元素;
* @author crf
*
* @param <T>
*/
public class BinaryTree<T> {
@SuppressWarnings("hiding")
private class Node<T>{
private T ele;
private Node<T> TreeLeft = null;
private Node<T> TreeRight = null;
}
private Comparator<T> comp;
private Node<T> rootNode = null;

public BinaryTree(Comparator<T> comp){
this.comp = comp;
}

public void addNode(T ele){
addNode(createNode(ele),rootNode);
}

public void showTree(){
showTree(rootNode);
}
/**
* for Test
* @param args
*/
public static void main(String[] args) {
BinaryTree<Integer> bt = new BinaryTree<>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});

bt.addNode(new Integer(1));
bt.addNode(new Integer(2));
bt.addNode(new Integer(3));
System.out.println(bt.rootNode);
bt.showTree();
}
/******************************* private method area *****************************/
/**
* 生成节点,该方法为私有,只能系统生成;
* @param ele
* @return
*/
private Node<T> createNode(T ele){
Node<T> thNode = new Node<>();
thNode.ele = ele;
return thNode;
}
/**
* 为了便于递归;
* @param newNode
* @param comp
* @param node
*/
private void addNode(Node<T> newNode,Node<T> node){
if(node==null) node = newNode;
else if(comp.compare(node.ele, newNode.ele)>0) addNode(newNode,node.TreeRight);
else addNode(newNode,node.TreeLeft);
}
/**
* 为了便于递归;
* @param node
*/
private void showTree(Node<T> node){
System.out.println("***************** show tree ****************");
if(node!=null){
System.out.println(node.ele);
if(node.TreeLeft != null) showTree(node.TreeLeft);
if(node.TreeRight != null) showTree(node.TreeRight);
}
}
}

在Main 方法中测试总是得到null;DEBUG也没办法看出问题;
...全文
298 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
/** * 为了便于递归; * @param newNode * @param comp * @param node */ private void addNode(Node<T> newNode,Node<T> node){ if(node==null) rootNode = newNode; else if(comp.compare(node.ele, newNode.ele)>0) addNode(newNode,node.TreeRight); else addNode(newNode,node.TreeLeft); } 改成这样,你没有设置到rootNode上去。。。。
pauliuyou 2017-11-22
  • 打赏
  • 举报
回复
private void addNode(Node<T> newNode,Node<T> node){ if(node==null) node = newNode; else if(comp.compare(node.ele, newNode.ele)>0) addNode(newNode,node.TreeRight); else addNode(newNode,node.TreeLeft); } 不要第二个参数
丶丶路遥 2017-11-15
  • 打赏
  • 举报
回复
问题出在第二个addNode方法,传入的newnode赋值给node之后,只限在函数内部,这里不像C中的指针,可以直接改变对象指针的指向 举个简单的例子 public static void main(String[] args) { Student s1 = new Student(1,99); Student s2 = new Student(2,100); swap(s1,s2); System.out.println(s1.getId()); } public static void swap(Student s1,Student s2){ s1 = s2; } 这两个函数是交换s1和s2,调用swap函数之后,打印s1发现并没有交换 也就是说, 你的rootnode一直都处在未实例化的状态

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧