package main

/*
type TreeLinkNode struct {
    Val int
    Left *TreeLinkNode
    Right *TreeLinkNode
    Next *TreeLinkNode
}
*/
/*
       A
	/     \
   B       C
  / \     / \
 D    E  F   G
     / \
    H   I
*/
// 中序 D -> B -> H -> E -> I -> A -> F -> C -> G -> nil
// 有右子树,下一结点是右子树中的最左结点 B -> H
// 无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点 H -> E
// 无右子树,且结点是该结点父结点的右子树,则一直沿着父结点追朔,直到找到某个结点是其父结点的左子树
// 			 如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点 I -> A,不存在 G -> nil

func GetNext(pNode *TreeLinkNode) *TreeLinkNode {
	if pNode == nil {
		return nil
	}

	// 有右子树
	if pNode.Right != nil {
		pNode = pNode.Right
		for pNode.Left != nil {
			pNode = pNode.Left
		}

		return pNode
	}

	// 无右子树
	for pNode.Next != nil {
		if pNode == pNode.Next.Left {
			return pNode.Next
		}
		// 一直沿着父结点追朔
		pNode = pNode.Next
	}

	return nil
}