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 }