• 有右子树,下一结点是右子树中的最左结点,例如 B,下一结点是 H
    • 无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点,例如 H,下一结点是 E
    • 无右子树,且结点是该结点父结点的右子树,则我们一直沿着父结点追朔,直到找到某个结点是其父结点的左子树,如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点。例如 I,下一结点是 A;例如 G,并没有符合情况的结点,所以 G 没有下一结点

    时间:O(n)
    空间:O(1)

    1. TreeLinkNode* GetNext(TreeLinkNode* pNode)
    2. {
    3. //有右子树,下一结点是右子树的最左结点
    4. if(pNode->right){
    5. pNode = pNode->right;
    6. while(pNode->left)pNode = pNode->left;
    7. return pNode;
    8. }else{//无右子树
    9. if(!(pNode->next))return NULL;//没有父结点,则没有下一结点
    10. else{
    11. //是父结点的左结点
    12. if(pNode == pNode->next->left){
    13. return pNode->next;
    14. }else{//是父结点的右结点
    15. while(pNode->next && pNode == pNode->next->right){
    16. pNode = pNode->next;
    17. }
    18. return pNode->next;
    19. }
    20. }
    21. }
    22. return NULL;
    23. }