0 0

简单数据结构---二叉树的建树问题:递归建树无法进入第二层,求解5

小弟刚刚学习数据结构,遇到了一个问题,代码如下
/**
 * 二叉树的节点类
 * @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;
	}
}


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());
		}
	}
}


出问题的地方是在这个方法
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的值都为空,也就是说每次递归都是只停留在第一次,一直无法进入二层递归,这是为什么?
2013年11月21日 13:06

2个答案 按时间排序 按投票排序

0 0

采纳的答案

我改了一下,可以通过了。很多都是空指针问题。

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);
}
}

2013年11月21日 15:29
0 0

if(root==null){
this.root = node;
return;
}

2013年11月21日 14:43

相关推荐

    二叉树建树、遍历、秋叶子结点数等功能的实现

    总之,这个C++实现涵盖了二叉树建树、遍历以及统计叶子结点和总结点数的核心功能,为学习和实践二叉树提供了一个实用的工具。对于希望提升算法技能或正在处理与二叉树相关问题的开发人员来说,这是一个宝贵的资源。

    算法训练方案详解

    - **定义**: 一种完全二叉树形式的特殊数据结构。 - **应用场景**: 实现优先队列。 - **注意事项**: 理解堆的性质和维护方法。 **7. Trie树** - **定义**: 一种用于存储字符串的树形结构。 - **应用场景**: ...

    数据结构(C语言版)(第2版)PPT.zip

    本资源“数据结构(C语言版)(第2版)PPT.zip”是由著名计算机教育家严蔚敏老师编写的第二版教材配套PPT,对于那些想要深入理解和掌握算法的学者来说,是一份非常宝贵的资料。 在数据结构的学习中,我们主要会接触...

    严蔚敏版数据结构算法实现与解析

    数据结构是计算机科学中的基石,对于任何想在软件开发领域有所建树的人来说,理解和掌握数据结构至关重要。下面我们将详细探讨该书涉及的知识点。 1. **线性结构**:线性结构是最基础的数据结构,如数组和链表。...

    数据结构1800例题与详细答案.

    这些例题涵盖了线性数据结构(如数组、链表、栈、队列)、树形数据结构(如二叉树、平衡树、堆)、图数据结构以及排序和搜索算法等多个方面。 1. **线性数据结构**:数组是最基础的数据结构,允许随机访问但不支持...

    数据结构_严蔚敏版数据结构(C语言版)参考答案

    《数据结构_严蔚敏版数据结构(C语言版)参考答案》是针对经典教材《数据结构》(C语言描述)的学习辅助资料,由著名计算机科学家严蔚敏教授编写。这本书深入浅出地介绍了数据结构的基本概念、原理和实现方法,以...

    算法精选实用知识库分享

    - **建树**:通常使用递归或迭代的方式建立,结点信息可以存储在节点内部或通过参数传递。 - 应用:例如,解决LeetCode中的区间操作问题,如933.最近的请求次数。 3. **并查集 (Union-Find)**: - 并查集是一种...

    数据结构 C语言描述

    数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便进行有效的计算和操作。在C语言中实现数据结构,可以充分利用C语言的底层特性,提高程序的效率和灵活性。以下是对标题和描述中涉及的知识...

    常用C语言算法源代码

    7. **数据结构**:C语言中的链表、栈、队列、树(二叉树、平衡树)等数据结构的实现,以及相关操作如插入、删除、查找等。 8. **递归和迭代**:递归和迭代是两种不同的解决问题的方式,通过对比学习,可以理解它们...

    Algorithm-Fundamentals.zip

    7. **递归与分治**:递归是解决问题的一种有力工具,而分治策略则是将大问题分解为小问题求解,如归并排序、快速排序等。 8. **复杂度分析**:了解时间复杂度和空间复杂度是评估算法效率的关键,它可以帮助我们选择...

    中大ACM题库的分类

    * 1149 等价表达式:判断表达式是否等价(递归求解)。 * 1136 山海经:n 长序列里求 m 次区间询问的最大连续子区间和,线段树/RMQ。 * 1252 Defining Moment:字符串划分前后缀。 * 1194 Message Flood:单词查找,...

    算法导论Code_syllablekqh_C++_算法_算法导论_

    3. 数据结构:链表、栈、队列、树(二叉树、平衡树如AVL和红黑树)、图等是算法的基础。理解这些数据结构如何工作以及如何在C++中实现它们,对于优化算法至关重要。 4. 动态规划:这是解决复杂问题的有效方法,如...

    二叉表达式树

    这种树形结构能够直观地展现表达式的运算顺序和结构,使得计算变得简单,同时也方便了编译器进行解析和优化。在C++编程中,我们通常使用类和对象来构建这种树。 首先,让我们了解二叉表达式树的基本结构。每个节点...

    线段树 经典范例~~~~

    线段树是一种高效的数据结构,主要用于处理区间查询与更新的问题。在计算机科学中,尤其是在算法设计和数据结构领域,线段树是解决这类问题的重要工具。它的核心思想是通过分治策略将大问题分解为小问题,使得我们...

Global site tag (gtag.js) - Google Analytics