请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

二分搜索树add的非递归实现

老师,我写了二分搜索树的非递归实现,我感觉我逻辑上没有问题,但是进行toString输出的时候并没有输出完整的一棵树,您可以看看是什么原因吗?

public void add(E e)
	{//添加元素的非递归写法
		//当这棵树为空的时候
		if (root == null) {
			size++;
			root = new Node(e);
			return ;
		}
		Node cur = root;
		while(cur!=null)
		{
			if (e.compareTo(cur.e) > 0) {
				cur = cur.right;
			}
			else if (e.compareTo(cur.e) < 0) {
				cur = cur.left;
			}
		}
		if (cur==null) {
			cur = new Node(e);
			size++;
			return;
		}
		
}


正在回答

2回答

cur是一个局部变量。你让cur等于新的节点,但return以后,cur这个局部变量就消失了。新的节点并没有挂接到二叉树上:)


回忆一下链表中的非递归添加节点,我们必须找到待添加元素之前的节点pre,让pre->next是新的节点,才能将新的节点挂接在链表上:)

0 回复 有任何疑惑可以回复我~
  • 提问者 沉迷Cpp的web #1
    好的老师,我明白了,谢谢老师
    回复 有任何疑惑可以回复我~ 2018-08-03 11:19:45
提问者 沉迷Cpp的web 2018-08-03 11:21:49
这是我修改调试过的代码
public void add(E e)
	{//添加元素的非递归写法
		//当这棵树为空的时候
		if (root == null) {
			size++;
			root = new Node(e);
			return ;
		}
		Node cur = root;
		Node prev = root;
		while(cur!=null)
		{
			if (e.compareTo(cur.e) > 0) {
				prev = cur;
				cur = cur.right;
				if (cur==null) {
					cur = new Node(e);
					prev.right = cur;
					size++;
					return;
				}
			}
			else if (e.compareTo(cur.e) < 0) {
				prev = cur;
				cur = cur.left;
				if (cur==null) {
					cur = new Node(e);
					prev.left = cur;
					size++;
					return;
				}
			}
		}
		
	}


0 回复 有任何疑惑可以回复我~
  • 你这个代码有问题,插入一个BST中已经存在的元素会进入死循环
    回复 有任何疑惑可以回复我~ 2019-08-15 10:32:35
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信