解题思路:
1.如果一个节点有右子树,那么他的下一个节点就是它的右子树中的最左子节点。
2.如果一个节点没有右子树,并且该节点是它父节点的左子节点,那么它的下一个节点就是它的父节点。
3.如果一个节点没有右子树,并且该节点是它父节点的右子节点,需要沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。
class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
if (pNode == null) {
return null;
}
//在当前节点存在的情况下
TreeLinkNode nextNode = null;
//如果一个节点有右子树,那么他的下一个节点就是他的右子树中的最左子节点
if (pNode.right != null) {
TreeLinkNode tempNode = pNode.right;
while (tempNode.left != null) {
tempNode = tempNode.left;
}
//循环结束后temp指向pNode右子树的最左子节点
return tempNode;
}
//获取父节点
TreeLinkNode next = pNode.next;
if (pNode.right == null && next != null) {
if (next.left == pNode) {
//如果一个节点没有右子树,并且它是父节点的左子节点,那么他的下一个节点就是他的父节点
TreeLinkNode temp = pNode.next;
return temp;
}
if (next.right == pNode) {
//如果一个节点没有右子树,并且它是父节点的右子节点,则沿着指向父节点的指针一直向上遍历
//直到找到一个节点,他的父节点的左子节点是它
TreeLinkNode parent = pNode.next;
while (parent.next != null) {
TreeLinkNode nextParent = parent.next;
if (nextParent.left == parent) {
return nextParent;
} else {
parent = parent.next;
}
}
//若循环结束,则证明未找到下一个节点,返回null;
nextNode = null;
}
}
return nextNode;
}
}