题干
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
举个栗子:
2
5 6
1 3 4 7
9
1的下一个结点就是5,9的下一个结点是2,3的一下个结点是9。
思路
由于我们知道还有指向父节点的指针,可以先进行一个具体的分析。
- 对于 没有左右节点,且是父节点的左子树时候,例如1,其下一个结点就是其父节点。
- 对于有左右子树或者是有右子树的节点来说,且右子树没有左子树。例如5和3,其下一个节点就是其右子树。
- 对于没有左右节点且是父节点的右子树时候,就需要向上查询,查询到某一个节点的父节点的左子树是其自己,如5,这个时候,9的下一个结点就是5的父亲。
- 对于有右子树且右子树有左子树时候,就递归到左子树的最下面节点,如2的下一个是4。
代码
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
TreeLinkNode head=pNode;
if(head==null) return null;
if(head.right!=null)
{
TreeLinkNode p=head.right;
while(p.left!=null)
p=p.left;
return p;
}
while(head.next!=null){
if(head.next.left==head) return head.next;
head=head.next;
}
return null;
}
}