剑指Offer-题8-二叉树的下一个节点
题目:二叉树的下一个节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解析
通过举例画出二叉树,分情况讨论(有序判断,不可颠倒):
- 给定节点含右子节点,判断给定节点右子节点
- 给定节点右子节点含左子节点,取给定节点右子节点左子叶
 - 给定节点右子节点含右子节点,取给定节点右子节点
 - 给定节点右子节点不含子节点,取给定节点右子节点
 
 - 给定节点不含右子节点,判断给定节点父节点
- 给定节点为其父节点左子节点,取给定节点父节点
 - 给定节点为其父节点右子节点,判断给定节点父节点父节点
- 给定节点父节点为其父节点左子节点,取给定节点父节点父节点
 - 给定节点父节点为其父节点右子节点,判断给定节点父节点父节点父节点
- ……(循环往复,直至节点为其父节左子节点)
 
 
 
 
根据讨论写出如下代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28BinaryTreeNode* findNext(BinaryTreeNode *pNode)
{
    if (nullptr == pNode)
        return nullptr;
    BinaryTreeNode *pNext = nullptr;
    if (pNode->right != nullptr)
    {
        pNext = pNode->right;
        if (pNext->left != nullptr)
        {
            while (pNext->left != nullptr)
                pNext = pNext->left;
            return pNext;
        }
        else
            return pNext;
    }
    else
    {
        pNext = pNode->root;
        while (pNext != nullptr && pNext->right == pNode)
        {
            pNode = pNext;
            pNext = pNode->root;
        }
        return pNext;
    }
}
与书中代码如出一辙😎!
本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可



