快手笔试题:字符串与二叉树之间的互相转换
在项目开发中,我们经常需要存储和检索二叉树结构。然后我快手一面的笔试题就是这个,我的答案如下,供大家参考。
class TreeNode {
char val; // 节点值
TreeNode left, right; // 左子树和右子树
// 树节点的构造函数
TreeNode(char val) {
this.val = val;
left = null;
right = null;
}
}
public class Main {
// 树转换为字符串
public String treeToString(TreeNode root) {
if (root == null) return ""; // 如果根节点为空,返回空字符串
StringBuilder sb = new StringBuilder();
sb.append(root.val); // 添加根节点的值
if (root.left != null || root.right != null) { // 如果左右子树不都为空
sb.append("/"); // 添加斜杠
sb.append(treeToString(root.left)); // 递归调用,转换左子树
sb.append("\\"); // 添加反斜杠
sb.append(treeToString(root.right)); // 递归调用,转换右子树
}
return sb.toString(); // 返回字符串表示的二叉树
}
// 字符串转换为树
public TreeNode stringToTree(String s) {
if (s == null || s.length() == 0) return null; // 如果字符串为空,返回空树
// System.out.println(s.toCharArray());
return buildTree(s.toCharArray(), 0);
}
public static void main(String[] args) {
Main main = new Main();
// 构建二叉树
TreeNode root = new TreeNode('A'); // 创建根节点
root.left = new TreeNode('B'); // 创建左子节点
root.right = new TreeNode('C'); // 创建右子节点
root.left.left = new TreeNode('D'); // 创建左子树的左子节点
root.left.right = new TreeNode('E'); // 创建左子树的右子节点
root.right.left = new TreeNode('F'); // 创建右子树的左子节点
root.right.right = new TreeNode('G'); // 创建右子树的右子节点
// 打印二叉树
printTree(root);
System.out.println();
// 将二叉树转换为字符串并打印
String treeString = main.treeToString(root);
System.out.println("Binary Tree String: " + treeString);
// 将字符串转换为二叉树并打印
TreeNode newRoot = main.stringToTree(treeString);
System.out.println("Reconstructed Tree: ");
printTree(newRoot);
}
// 递归构建二叉树
private TreeNode buildTree(char[] chars, int index) {
if (index >= chars.length) return null; // 如果索引超出字符串长度,返回空树
TreeNode node = new TreeNode(chars[index]); // 创建当前节点
index ++; // 索引加一
if (index < chars.length && chars[index] == '/') { // 如果当前字符为斜杠
index ++; // 索引加一
node.left = buildTree(chars, index); // 递归构建左子树
}
if (index < chars.length && chars[index] == '\\') { // 如果当前字符为反斜杠
index++; // 索引加一
node.right = buildTree(chars, index); // 递归构建右子树
}
return node; // 返回当前节点
}
// 递归打印二叉树
private static void printTree(TreeNode root) {
if (root == null) return; // 如果根节点为空,结束递归
System.out.print(root.val + " "); // 打印当前节点的值
printTree(root.left); // 递归打印左子树
printTree(root.right); // 递归打印右子树
}
}
运行结果如下: