JZ57 二叉树的下一个结点

二叉树的下一个结点

题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路:根的前一个节点是左子树遍历的最后一个节点,根节点的下一个节点是右子树遍历的第一个节点,即右子树最左边的节点。

本题的思路是:按照当前节点是否有右子树进行划分。

如果有右子树,那么就是右子树遍历到的最左边的孩子节点。

如果没有右子树,就需要向上访问父节点,只要该父节点的父节点左孩子是父节点,就是第一个左转的节点,即为答案。

func GetNext(pNode *TreeLinkNode) *TreeLinkNode {
    if pNode == nil {
        return nil
    }
    //have right subtree
    if pNode.Right != nil {
        nextRight := pNode.Right
        for  nextRight.Left != nil {
            nextRight = nextRight.Left
        }
        return nextRight
    } else{ //have not right subtree
        for  pNode.Next != nil {
            if (pNode.Next.Left != nil) && (pNode.Next.Left == pNode) {//可以直接比较指针
                return pNode.Next
            }
            pNode = pNode.Next
        }
    }
    return nil
}

 

posted @ 2021-04-10 23:18  zqlucky  阅读(52)  评论(0编辑  收藏  举报