例子
由于是二叉搜索树的原因,当知道二叉树的前序或者后序遍历之后,就能排序得到二叉树的中序遍历。
因此,可以根据搜索树的特性来重构二叉树:
几个我在写的过程中错误的点:
- 解码二叉树时,中间有逗号,不用stringbuffer,直接用list转string,可得到想要的结果。
- 在使用list转为string之后,进行split(“,”)分割时,需要在逗号后加空格,因为list转string时默认是", "。
- 我开始想的是排序之后得到中序遍历然后构建,实际上直接通过栈来判断是哪颗树就行。
代码如下:
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
List<Integer> list = new ArrayList<>();
dfs(root,list);
String result = list.toString();
return result.substring(1,result.length()-1);
}
public void dfs(TreeNode root,List<Integer> list){
if(root==null) return;
dfs(root.left,list);
dfs(root.right,list);
list.add(root.val);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data.isEmpty()) return null;
String[] arr = data.split(", ");
Deque<Integer> stack = new ArrayDeque<>();
int length = arr.length;
for(int i=0;i<length;i++){
stack.push(Integer.parseInt(arr[i]));
}
return construct(Integer.MIN_VALUE,Integer.MAX_VALUE,stack);
}
private TreeNode construct(int lower,int upper,Deque<Integer> stack){
if(stack.isEmpty() || stack.peek()<lower || stack.peek()>upper){
return null;
}
int val = stack.pop();
TreeNode root = new TreeNode(val);
root.right = construct(val,upper,stack);
root.left = construct(lower,val,stack);
return root;
}
}