例二:寻找中序遍历时的下一结点
注意:双向箭头
给一个结点,求中序遍历时的下一个结点。
把输入的中序遍历从递归改成非递归。
思考
中序遍历:
先中序遍历左子树,
再遍历树根,
再中序遍历右子树。
中序遍历所看到的第一个节点
D是第一个节点,没有左儿子,可能有右儿子,先遍历D的右儿子,没有右儿子,回到D的父亲B。
遍历B的右子树E级所在的树,从E一直往左走
G的下一个结点是E(E的左子树已经访问完毕了)。
E的下一个结点是A(往上走2步)
阐述关系:
E是B的右子树:遍历完E的时候,找的下一个结点不是B。
继续往上走,走到什么时候怎么停下来?
当某个结点的左子树是它父亲,才停下来
A往上走不下去了,A负责的下一个结点是null,所以A是中序遍历的最后一个结点。
对搜索树做中序遍历有非常大的好处:
找一个元素就非常简单。
出来的就是有序的序列。
这是一棵搜索树。
这棵树的中序遍历的结果:1234567【有序序列】
发现:
任何一个结点,左子树的值都比根小,
右子树的值都比根大。
程序怎么写?先搭框架
- 假设N之前的中序遍历是正确的,
- 然后遍历结点N,
- 遍历完之后,遍历下一个结点,
- 如果能正确找到下一个结点,就能正确的遍历这棵树。
下一个结点,有3条路可走:
左下
右下
往上走
什么情况向左走?
没有情况需要向左走。
中序遍历先遍历左子树,再遍历自己。
N已经遍历完了,说明N的左子树已经遍历完了。【假设】【循环不变式】
如果N存在右子树,怎么办?
访问右子树的第一个节点R
如果N没有右子树,怎么办?
往上走
往上走怎么走,走多少步?
如果N是P的左子树,返回P
如果N是P的右子树怎么办?
继续往上走
往上走之后还是上上个结点的右子树怎么办?
继续往上走,走到 它是某个结点的左子树为止,
最终的父亲就是N的下一个结点