##题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
##解题思路
1,因为是中序遍历,顺序为左—中----右
2,因为考虑下一个节点,所以考察范围可以缩小到中和右
3,如果当前节点有右子树,那么下一个节点就是右子树的最左节点
4,如果当前节点没有右子树,且是父节点的左子节点,则下一个节点就是自己的父节点
5,如果当前节点没有右子树,且是父节点的右子节点,则向上找到第一个是其父节点左子节点的节点,下一个节点就是该父节点
##代码
/**
*
*/
package offerTest;
/**
* <p>
* Title:Next
* </p>
* <p>
* Description:
* </p>
*
* @author 田茂林
* @data 2017年8月21日 上午10:34:53
*/
class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
public class Next {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
if (pNode == null) {
return null;
}
// 如果当前节点有右子树
if (pNode.right != null) {
TreeLinkNode p = pNode.right;
while (p.left != null) {
p = p.left;
}
return p;
} else { // 如果当前节点没有右子树,且是父节点的左子节点
if (pNode.next != null) {
TreeLinkNode pcur = pNode;
TreeLinkNode parent = pcur.next;
if (parent != null && pcur == parent.left) { 如果当前节点没有右子树,且是父节点的左子节点,则下一个节点就是自己的父节点
return parent;
}
while (parent != null && pcur == parent.right) {如果当前节点没有右子树,且是父节点的右子节点,则向上找到第一个是其父节点左子节点的节点,下一个节点就是该父节点
pcur = parent;
parent = pcur.next;
}
return parent;
}
}
return null;
}
}