1.二叉树的序列化与反序列化
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
String SEP=",";
String NULL="#";
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
//可以采用前序遍历,使用字符串进行序列化
StringBuilder sb=new StringBuilder();
serialize(root,sb);
return sb.toString();
}
public void serialize(TreeNode root,StringBuilder sb){
if(root==null){
sb.append(NULL).append(SEP);
return;
}
sb.append(root.val).append(SEP);
serialize(root.left,sb);
serialize(root.right,sb);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
//将字符串data按照SEP切割,成为一个个节点
LinkedList<String> list=new LinkedList<>();
for(String s:data.split(SEP)){
list.add(s);
}
return deserialize(list);
}
public TreeNode deserialize(LinkedList<String> list){
if(list.size()==0){
return null;
}
//list中第一个位置就是根节点,如果该位置为NULL,则返回空节点
String first=list.removeFirst();
if(NULL.equals(first)){
return null;
}
TreeNode root=new TreeNode(Integer.parseInt(first));
root.left=deserialize(list);
root.right=deserialize(list);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));
也可以使用后序遍历和层序遍历解,但是不能使用中序遍历,因为找不到根节点的位置
2.二叉搜索树中第k小的元素
/**
* 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 Solution {
int rank=0;
int res=-1;
public int kthSmallest(TreeNode root, int k) {
traverse(root,k);
return res;
}
//中序遍历是一个升序的序列
//进行中序遍历,定义一个rank变量,每遇到一个节点就加一,当rank==k时,就找到了第k小的元素
public void traverse(TreeNode root,int k){
if(root==null){
return;
}
traverse(root.left,k);
rank++;
if(rank==k){
res=root.val;
return;
}
traverse(root.right,k);
}
}
3.把二叉树转换为累加树
/**
* 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 Solution {
int sum=0;
public TreeNode convertBST(TreeNode root) {
traverse(root);
return root;
}
public void traverse(TreeNode root){
if(root==null){
return;
}
//先遍历右节点,再遍历中间节点,再遍历左节点
traverse(root.right);
sum+=root.val;
root.val=sum;
traverse(root.left);
}
}