0
点赞
收藏
分享

微信扫一扫

每日一题 leetcode 面试题 04.06. 后继者 java

吓死我了_1799 2022-05-16 阅读 84

题目

https://leetcode.cn/problems/successor-lcci/

代码

效率很低的,将中序遍历的结果保存,然后取p的下一个

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    ArrayList<TreeNode> list;
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        list=new ArrayList<>();
        //list.add(root);
        dfs(root);
        for(int i=0;i<list.size();i++){
            if(list.get(i)==p){
                if(i!=list.size()-1){
                    return list.get(i+1);
                }
                break;
            }
        }
        return null;
    }
    public void dfs(TreeNode root){
        if(root==null)  return;
        dfs(root.left);
        list.add(root);
        dfs(root.right);
    }
}

中序遍历的迭代写法

/**
 * 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) {
        Deque<TreeNode> stack=new ArrayDeque<>();
        TreeNode pre=null,cur=root;
        while(!stack.isEmpty()||cur!=null){
            while(cur!=null){
                stack.push(cur);
                cur=cur.left;
            }
            cur=stack.pop();
            if(pre==p){
                return cur;
            }
            pre=cur;
            cur=cur.right;
        }
        return null;
    }
}

利用二叉搜索树特点

class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        TreeNode res=null;
        //有右子树肯定在右子树中
        if(p.right!=null){
            TreeNode cur=p.right;
            while(cur!=null){
                res=cur;
                cur=cur.left;
            }
            return res;
        }
        TreeNode node=root;
        while(node!=null){
            if(node.val>p.val){//p在node或node的左子树
                res=node;
                node=node.left;
            }
            else{//p在node的右子树
                node=node.right;
            }
        }
        return res;
    }
}
举报

相关推荐

0 条评论