题目:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
知识点:
二叉树的中序遍历:左、根、右。
二叉树的前序遍历:根、左、右。
二叉树的后序遍历:左、右、根。
思路:
由于二叉树的中序遍历是:左、根、右。因此,拿到的节点一定已经遍历完它的左子树了。
1、如果该节点的右子树不为空,
如果右子树的左节点不为空,返回右子树的最深左节点;
返回右子树根节点;
2、如果该节点根不为空,
如果根的右子树不是它自己,则返回根节点;
如果根的右子树是它自己,继续向上遍历,找根节点,循环条件2。
3、都不满足,返回空。
答案:
/*
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==null){return null;}
/*if(pNode.left!=null){//左子树已经遍历完
while(pNode.left!=null){
pNode = pNode.left;
}
return pNode;
}*/
if(pNode.right!=null){
TreeLinkNode p = pNode.right;
while(p.left!=null){
p = p.left;
}
return p;
}
if(pNode.next!=null){
while(pNode.next!=null){
if(pNode.next.right!=pNode){
return pNode.next;
}else{
pNode = pNode.next;
}
}
}
return null;
}
}