算法学习 补29天题解 后继者

 

目录

 一、题目

1、题目描述

2、基础框架

3、原题链接

二、解题报告

1、思路分析

(1)中序遍历求解

(2)用二叉搜索树的性质求解

2、代码详解

  (1)中序遍历

 (2)利用二叉搜索树的性质

三、本题小知识


 一、题目


1、题目描述

设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。

如果指定节点没有对应的“下一个”节点,则返回null

示例 1:

输入: root = [2,1,3], p = 1

  2
 / \
1   3

输出: 2


示例 2:

输入: root = [5,3,6,2,4,null,null,1], p = 6

      5
     / \
    3   6
   / \
  2   4
 /   
1

输出: null

2、基础框架

   Java 版本给出的基础框架代码如下:   

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {

    }
}

算法学习 补29天题解 后继者_第1张图片

3、原题链接

    LeetCode 面试题 04.06. 后继者

二、解题报告


1、思路分析

(1)中序遍历求解

       记录当前节点,和他的上一个结点

       若当前节点的上一个结点和p结点相同则返回当前结点

       若没有结点的上一个结点和当前结点相同,则返回null

(2)用二叉搜索树的性质求解

      根据二叉搜索树的性质,我们知道中序遍历满足:

  • 后继节点的节点值大于 ppp 的节点值;

  • 后继节点是节点值大于 ppp 的节点值的所有节点中节点值最小的一个节点。


2、代码详解

  (1)中序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        //定义栈结构来实现部分中序遍历
        LinkedList stack=new LinkedList();
        //pre记录当前结点的前一个结点
        TreeNode pre=null;
        //记录当前结点  中序遍历 左->根->右
        TreeNode cur=root;
        while(!stack.isEmpty()||cur!=null){
            while(cur!=null){//cur结点入栈
                stack.addFirst(cur);
                cur=cur.left;
                
            }
            //抛出栈顶结点
            cur=stack.poll();
            //r如果前一个结点为p则返回当前结点
            if(pre==p){
                return cur;
            }
            //更新前一个结点
            pre=cur;
            //检验右子树
            cur=cur.right;
        }
        return null;
    }
}

 (2)利用二叉搜索树的性质

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        TreeNode successor = null;
        TreeNode node = root;
        while (node != null) {
            //当前结点比p结点的值大,把结果结点更新为当前节点
            //并在继续检测左子树
            if (node.val > p.val) {
                successor = node;
                node = node.left;
            } else {
                //当前结点小于p结点,在右子树中找
                node = node.right;
            }
        }
        return successor;
    }
}

三、本题小知识

二叉搜索树  左子树所有结点比根结点小,右子树所有结点比根结点大

你可能感兴趣的:(算法刷题打卡,算法)