题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
首先需要分两种情况:
- 此节点存在右子树,那么它的下一个节点就为右子树中的最左节点
- 此节点不存在右子树,可能是最右节点,也可能是最左节点
- 如果它为最左节点,那么下一个节点就是node->next,即它的父节点
- 如果它为最右节点,那么下一个节点就是父节点的父节点的父节点,或者不存在
/*
public 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.right != null){
TreeLinkNode node = pNode.right;//先指向右子树
//对这个右子树进行中序遍历,即找到它的最左节点
while(node.left != null) node = node.left;
return node;
}else{
while(pNode.next != null){
//先找到它的父节点
TreeLinkNode parent = pNode.next;
//当此节点为左节点
if(parent.left == pNode) return parent;
pNode = pNode.next;
}
}
return null;
}
}