剑指offer7_二叉树的下一个节点

二叉树的下一个节点


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

注意:

  • 如果给定的节点是中序遍历序列的最后一个,则返回空节点;
  • 二叉树一定不为空,且给定的节点一定不是空节点;
  • 不同节点权值不同;
数据范围

树中节点数量 [0,100]。

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

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

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

题解
  1. 当前节点存在右子树

    • 后继节点为右子树中的最左侧节点
    • 示例:若当前节点是 F,其后继为 H(假设 F 的右子树最左侧节点为 H)。
  2. 当前节点无右子树

    • 沿父节点向上回溯,找到第一个是其父节点左子节点的节点,该节点的父节点即为后继。
    • 示例:若当前节点是 D,回溯找到第一个是父节点左子节点的节点 F,则 F 的父节点 C 的后继为 F

      注:需检查示例逻辑一致性,原文描述可能存在歧义,实际应为:节点 D 向上找到第一个作为左子节点的祖先路径节点,其父节点即为后继。

时间复杂度分析
  • 遍历节点数:无论向上回溯还是向下搜索右子树,遍历的节点数均不超过树的高度。
  • 时间复杂度: O(h)
/**
 * 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 == p->father->right)
        {
            p = p->father;
        }
        
        return p->father;
    }
};

你可能感兴趣的:(算法,算法,数据结构)