小弟刚刚学习数据结构,遇到了一个问题,代码如下 Java代码 收藏代码
/**
* 二叉树的节点类
* @author se7en
*
*/
public class JTreeNode {
private int nValue;//节点的值
private JTreeNode leftChild;//节点的左指针
private JTreeNode rightChild;//节点的右指针
public JTreeNode(int nValue){
this.nValue = nValue;
}
public void setnValue(int nValue) {
this.nValue = nValue;
}
public int getnValue() {
return nValue;
}
public void setRightChild(JTreeNode rightChild) {
this.rightChild = rightChild;
}
public JTreeNode getRightChild() {
return rightChild;
}
public void setLeftChild(JTreeNode leftChild) {
this.leftChild = leftChild;
}
public JTreeNode getLeftChild() {
return leftChild;
}
}
Java代码 收藏代码
public class JTree {
private JTreeNode root;//根节点
public void add(int nValue){
JTreeNode tem = new JTreeNode(nValue);
add(root,tem);
}
private void add(JTreeNode root,JTreeNode node){
//若树为空
if(root==null){
root = node;
return;
}
//若树不为空,则比该较节点与根节点的大小
else{
//若小于等于,则递归遍历左子树
if(node.getnValue()<=root.getnValue()){
add(root.getLeftChild(),node);
}
//若大于,则递归遍历右子树
else{
add(root.getRightChild(),node);
}
}
}
//中序遍历:根左右
public void middleTravel(JTreeNode root){
if(root == null){
System.out.println(root.getnValue()+" ");
}
else{
middleTravel(root.getLeftChild());
middleTravel(root.getRightChild());
}
}
}
出问题的地方是在这个方法 Java代码 收藏代码
private void add(JTreeNode root,JTreeNode node){
//若树为空
if(root==null){
root = node;
return;
}
//若树不为空,则比该较节点与根节点的大小
else{
//若小于等于,则递归遍历左子树
if(node.getnValue()<=root.getnValue()){
add(root.getLeftChild(),node);
}
//若大于,则递归遍历右子树
else{
add(root.getRightChild(),node);
}
}
}
我的想法是这样的:第一个传入参数,root为空,直接将node赋给root,第二次传入参数时,root不为空,则比较大小,进入第二层的递归。 问题就来了,不管我第几次传入参数,测试时,root的值都为空,也就是说每次递归都是只停留在第一次,一直无法进入二层递归,这是为什么?
我改了一下,可以通过了。很多都是空指针问题。
public class JTree {
public JTreeNode root;//根节点
public void add(int nValue){
JTreeNode tem = new JTreeNode(nValue);
if (root == null) {
root = tem;
} else {
add(root,tem);
}
}
private void add(JTreeNode root,JTreeNode node){
//若树为空
if(root==null){
root = node;
return;
}
//若树不为空,则比该较节点与根节点的大小
else{
//若小于等于,则递归遍历左子树
if(node.getnValue()<=root.getnValue()){
JTreeNode child = root.getLeftChild();
if (child == null) {
root.setLeftChild(node);
} else {
add(child,node);
}
}
//若大于,则递归遍历右子树
else{
JTreeNode child = root.getRightChild();
if (child == null) {
root.setRightChild(node);
} else {
add(child,node);
}
}
}
}
//中序遍历:根左右
public void middleTravel(JTreeNode root){
if(root != null){
System.out.println(root.getnValue()+" ");
middleTravel(root.getLeftChild());
middleTravel(root.getRightChild());
}
}
public static void main(String[] args) {
JTree tree = new JTree();
tree.add(5);
tree.add(2);
tree.add(8);
tree.middleTravel(tree.root);
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。