提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
可以直接中序遍历两个 BST 得到两个有序数组,然后把这两个有序数组合并,这个思路简单,但是空间复杂度会高一些
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
StringBuilder sb = new StringBuilder();
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
fun(root);
return sb.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data.isEmpty()){
return null;
}
LinkedList<Integer> list = new LinkedList<>();
for(String s : data.split(",")){
list.add(Integer.parseInt(s));
}
return fun(list,Integer.MIN_VALUE, Integer.MAX_VALUE);
}
public TreeNode fun(LinkedList<Integer> list, int min, int max){
if(list.isEmpty()){
return null;
}
int temp = list.getFirst();
if(temp > max || temp < min){
return null;
}
list.removeFirst();
TreeNode cur = new TreeNode(temp);
cur.left = fun(list, min, temp);
cur.right = fun(list, temp, max);
return cur;
}
public void fun(TreeNode root){
if(root == null){
return;
}
sb.append(root.val).append(",");
fun(root.left);
fun(root.right);
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// String tree = ser.serialize(root);
// TreeNode ans = deser.deserialize(tree);
// return ans;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class BSTIterator {
List<Integer> list = new ArrayList<>();
int index = 0;
public BSTIterator(TreeNode root) {
fun(root);
}
public int next() {
int cur = list.get(index);
index ++;
return cur;
}
public boolean hasNext() {
if(index < list.size()){
return true;
}
return false;
}
public void fun(TreeNode root){
if(root == null){
return ;
}
fun(root.left);
list.add(root.val);
fun(root.right);
}
}
/**
* Your BSTIterator object will be instantiated and called as such:
* BSTIterator obj = new BSTIterator(root);
* int param_1 = obj.next();
* boolean param_2 = obj.hasNext();
*/