解答一
java
class Solution {
List<TreeNode> nodes = new ArrayList<>();
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
inorder(root);
int index = -1;
for (int i = 0; i < nodes.size(); ++i) {
TreeNode node = nodes.get(i);
if (node.val == p.val) {
index = i;
break;
}
}
if (index == -1) {
return null;
}
if (index == nodes.size() - 1) {
return null;
}
return nodes.get(index + 1);
}
void inorder(TreeNode root) {
if (root == null) {
return;
}
inorder(root.left);
nodes.add(root);
inorder(root.right);
}
}
解答二
java
class Solution {
List<TreeNode> nodes = new LinkedList<>();
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
inorder(root, p);
if (nodes.isEmpty()) {
return null;
}
nodes.removeFirst();
if (nodes.isEmpty()) {
return null;
}
return nodes.removeFirst();
}
void inorder(TreeNode root, TreeNode p) {
if (root == null) {
return;
}
inorder(root.left, p);
if (root.val >= p.val) {
nodes.add(root);
}
inorder(root.right, p);
}
}
总结
利用二叉搜索树的特征,中序遍历时为升序排列的结果。