1. class Solution {
    2. public:
    3. TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
    4. TreeNode *successor = nullptr;
    5. /* p节点有右子树就从p节点右子树开始搜索 */
    6. if (p->right != nullptr) {
    7. successor = p->right;
    8. while (successor->left != nullptr) {
    9. successor = successor->left;
    10. }
    11. return successor;
    12. }
    13. /* 从二叉搜索树当中查找p节点的父节点 */
    14. TreeNode *node = root;
    15. while (node != nullptr) {
    16. if (node->val > p->val) {
    17. /* 如果p在左子树,后继节点会是当前节点或者当前左子树中的节点 */
    18. successor = node;
    19. node = node->left;
    20. } else {
    21. /* 当前值小于p的val 说明不能满足后继节点的大于pval的条件 */
    22. node = node->right;
    23. }
    24. }
    25. return successor;
    26. }
    27. };

    设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。

    这里首先对 p节点的右子树的最左子节点,如果存在右子树就可以在右子树有后序节点;如果右子树为空,需要在二叉搜索树当中的查找p节点的父节点,