一、题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
二、解题思路
分三种情况:
1)如果当前结点有右子树,那么它的下一个结点就是它的右子树的最左子结点;
2)如果当前结点没有右子树,且为它父结点的左子结点,那么它的下一个结点就是它的父结点;
3)如果当前结点没有右子树,且为它父结点的右子结点,则一直向上遍历,直到找到一个是它父结点的左子结点的结点。
例如:
[1]
[2] [3]
[4] [5] [6] [7]
中序遍历序列为:{4,2,5,1,6,3,7}
第一种情况:当前结点有右子树,如1,那么它的下一个结点就是它的右子树的最左子结点,为6
[1]
[2] [3]
[4] [5] [6] [7]
第二种情况:当前结点没有右子树,且为它父结点的左子结点,如4,那么它的下一个结点就是它的父结点,为2
[1]
[2] [3]
[4] [5] [6] [7]
第三种情况:当前结点没有右子树,且为它父结点的右子结点,如5,则一直向上遍历,直到找到一个是它父结点的左子结点的结点,为1
[1]
[2] [3]
[4] [5] [6] [7]
三、编程实现
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
if (pNode == null) {
return null;
}
// 如果结点有右子树,那么它的下一个结点就是它的右子树的最左子结点
if (pNode.right != null) {
pNode = pNode.right;
while (pNode.left != null) {
pNode = pNode.left;
}
return pNode;
}
// 结点没有右子树
while (pNode.next != null) {
// 如果结点是它父结点的左子结点,那么它的下一个结点就是它的父结点
if (pNode.next.left == pNode) {
return pNode.next;
}
// 如果结点是它父结点的右子结点,则一直向上遍历,直到找到一个是它父结点的左子结点的结点
pNode = pNode.next;
}
return null;
}
}