题目
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;
}
}