##题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
##解题思路
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; } }