序列化
前序序列化二叉树 一个前序遍历的二叉树,没有子节点的位置使用#来代替,进行反序列化。"1,2,4,#,#,5,7,#,#,8,#,#,3,#,6,9,#,#,#"
public class DeserializeTree {
// 指定字符的位置
int start = -1;
private TreeNode
deserializeTree(String[] tree) {
//每次操作进行+1,操作下一个字符。
start++;
// 当小于数组长度 并且不等于#情况下创建节点,否则为该节点的孩子节点返回null
if (start < tree.length && !tree[start].equals("#")) {
//为当前节点创建对象
TreeNode node = new TreeNode(Integer.parseInt(tree[start]));
// 为当前节点的左孩子赋值
node.left = deserializeTree(tree);
// 为当前节点的右孩子赋值
node.right = deserializeTree(tree);
return node;
}
return null;
}
public TreeNode deserialize(String tree) {
// 进行拆分
String[] treeData = tree.split(",");
TreeNode root = deserializeTree(treeData);
return root;
}
}
反序列化
前序反序列化
"1,2,4,#,#,5,7,#,#,8,#,#,3,#,6,9,#,#,#"
前序遍历是先输出父节点,在输出左孩子节点,在输出右孩子节点。
先读取第一个字符1 为父节点,
初始化左树
读取第二个字符2,为左孩子节点,
读取第三个字符4,为第二个字符的左孩子节点
开始为第四个节点进行赋值
读取第四个字符#,是第三个字符左孩子为空,返回null。
读取第五个字符#,是第三个字符右孩子为空,返回null
回溯到第二个节点,
读取第六个字符5,是第二个节点的右孩子节点
读取第七个字符7,是第六个节点的左孩子节点
...
public class DeserializeTree {
int start = -1;
private TreeNode deserializeTree(String[] tree) {
start++;
if (start < tree.length && !tree[start].equals("#")) {
TreeNode node = new TreeNode(Integer.parseInt(tree[start]));
node.left = deserializeTree(tree);
node.right = deserializeTree(tree);
return node;
}
return null;
}
public TreeNode deserialize(String tree) {
String[] treeData = tree.split(",");
TreeNode root = deserializeTree(treeData);
return root;
}
}
二叉树深度
// Depth 深度
public static int getDepthTree(TreeNode node) {
if (node == null) {
return 0;
}
int leftDepth = getDepthTree(node.left);
int rightDepth = getDepthTree(node.right);
int depth = Math.max(leftDepth, rightDepth) +1;
return depth;
}
是否是满二叉树
// 判断是否是 满二叉树
public static boolean isBalanceTree(TreeNode node) {
if (node == null) {
// 空树也是一个棵二叉树
return true;
}
int leftDepth = getDepthTree(node.left);
int rightDepth = getDepthTree(node.right);
// 左右字数的深度绝对值不能超过1 左右子树都是二叉树
return Math.abs(leftDepth - rightDepth)<=1 &&isBalanceTree(node.left) && isBalanceTree(node.right);
}