剑指offer 7. 二叉树的下一个节点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohaibo_/article/details/85543835

给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。

注意:
如果给定的节点是中序遍历序列的最后一个,则返回空节点;
二叉树一定不为空,且给定的节点一定不是空节点;

样例

假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。

则应返回值等于3的节点。

解释:该二叉树的结构如下,2的后继节点是3。
  2
 / \
1   3

后继节点是中序遍历中的下一个元素,也就是二叉搜索树中比这个数大的最小的元素,二叉搜索树中最大的元素没有后继

[image:2F9529F0-0A82-4956-94A5-09EE157B5F7B-515-0000096C16E6A265/屏幕快照 2019-01-01 下午3.29.25.png]

  • 二叉树中某个节点如果有右子树,则右子树最左边的元素是后继,如F的后继为H

  • 如果某个节点没有右子树,且为其父节点的左儿子,则它的父节点就是它的后继,如B的后继为D

  • 如果某个节点没有右子树,且为其父节点的右儿子,则它向上找第一个为左儿子的节点的父节点是它的后继,如D的后继为F

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode *father;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL), father(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* inorderSuccessor(TreeNode *p) {
        if (p->right) {
            p = p->right;
            while (p->left) p = p->left;
            return p;
        }
        while (p->father && p->father->right == p) p = p->father;
        return p->father;
    }
};

猜你喜欢

转载自blog.csdn.net/zhaohaibo_/article/details/85543835