Java数据结构:中根次序遍历二叉排序树

        昨天离开了创新创业基地,有点难受,虽然换来了高效,但是总觉的难受,一起度过了半年,昨天离开了。

说正事,今天更新二叉排序树的中根遍历。

        思想:其实没啥,类似与二叉树的非递归中根遍历,先找到最左边的那个,由于二叉排序树的特点,最左边的那个为最小值,先通过first()方法,找到最左边的那个,一直沿着p的左子树往下走,一直走到p=null,返回最后一个p。然后又通过next()方法找下一个将要输出的,这里是中序遍历的核心,这里就有必要讲一下中序遍历了。

         中序遍历:先判断其是否又右孩子,因为p从左子树开始,如果有右子树,则其下一个结点便是右子树,因为中序遍历,先从结点开始,发现有右孩子则判断是否有孩子,如果没有则打印,然后打印父母结点(此时是第二次遍历到父母结点,第一次为从父母结点开始遍历左子树)然后到右子树,,,,懂我意思吧。

      接着上文,如果p有右孩子则需要遍历了p的右孩子才能回到p的父母节点,原理如上所述。

废话少说---上代码

public void inorder() // 以中根次序遍历二叉树,输出所有结点元素,非递归算法
	{
		System.out.print("[");
		TriNode<T> p = this.first(this.root); // 寻找第一个访问结点,最小值
		while (p != null) {
			System.out.print(p.data.toString() + " ");
			p = this.next(p); // 返回p在中根次序下的前驱结点
		}
		System.out.println("]");
	}

	// 在以p为根的子树中,返回中根次序下第一个访问结点,即是根的最左边的子孙结点,最小值
	public TriNode<T> first(TriNode<T> p) {
		if (p != null)
			while (p.left != null)
				p = p.left;
		return p;
	}

	public TriNode<T> next(TriNode<T> p) // 返回p在中根次序下的后继结点
	{
		if (p != null) {
			if (p.right != null) // 若p有右孩子,
				return this.first(p.right); // 则p的后继是其右子树第一个访问结点
			while (p.parent != null) // 若p没有右孩子,向上寻找某个祖先结点
			{
				if (p.parent.left == p) // 若p是其父母的左孩子,则p的后继是其父母
					return p.parent;
				p = p.parent;
			}
		}
		return null;
	}

猜你喜欢

转载自blog.csdn.net/qq_42192693/article/details/84976946