昨天离开了创新创业基地,有点难受,虽然换来了高效,但是总觉的难受,一起度过了半年,昨天离开了。
说正事,今天更新二叉排序树的中根遍历。
思想:其实没啥,类似与二叉树的非递归中根遍历,先找到最左边的那个,由于二叉排序树的特点,最左边的那个为最小值,先通过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;
}