剑指 Offer II 053. 二叉搜索树中的中序后继(285.二叉搜索树中的中序后继)

题目:

 

 

思路:

【1】中序遍历

【2】利用二叉搜索树的性质

代码展示:

利用二叉搜索树的性质的方式:

//时间2 ms击败100%
//内存42.2 MB击败74.85%
//时间复杂度:O(n),其中 n 是二叉搜索树的节点数。遍历的节点数不超过二叉搜索树的高度,平均情况是 O(log⁡n),最坏情况是 O(n)。
//空间复杂度:O(1)。
class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        TreeNode successor = null;
        //这里是利用了中序遍历的的特性,如果存在右子树,那么最左边的节点就是后继节点
        if (p.right != null) {
            successor = p.right;
            while (successor.left != null) {
                successor = successor.left;
            }
            return successor;
        }
        TreeNode node = root;
        while (node != null) {
            //这里才是用到了二叉搜索树的特性
            if (node.val > p.val) {
                successor = node;
                node = node.left;
            } else {
                node = node.right;
            }
        }
        return successor;
    }

}

 

中序遍历的方式(由于所谓的后继节点其实也就是中序遍历中该节点的下一个节点,所以中序遍历一下然后将全部节点存于数组中就可以很容易找出来):

//时间4 ms击败35.35%
//内存42.5 MB击败29.22%
//时间复杂度:O(n),其中 n 是二叉搜索树的节点数。中序遍历最多需要访问二叉搜索树中的每个节点一次。
//空间复杂度:O(n),其中 n 是二叉搜索树的节点数。空间复杂度取决于栈深度,平均情况是 O(log⁡n),最坏情况是 O(n)。
/**
 * 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) {
        ArrayList<TreeNode> treeList = new ArrayList<>();
        middleDFS(root,treeList);
        for (int i = 0; i < treeList.size();i++){
            if (treeList.get(i) == p && i+1 < treeList.size())
                return treeList.get(i+1);
        }
        return null;
    }

    public void middleDFS(TreeNode root,ArrayList<TreeNode> list){
        if (root == null) return;
        if (root.left != null) middleDFS(root.left,list);
        list.add(root);
        if (root.right != null) middleDFS(root.right,list);
    }
}

 

posted @ 2023-03-22 14:05  忧愁的chafry  阅读(17)  评论(0)    收藏  举报