快手笔试题:字符串与二叉树之间的互相转换

快手笔试题:字符串与二叉树之间的互相转换

在项目开发中,我们经常需要存储和检索二叉树结构。然后我快手一面的笔试题就是这个,我的答案如下,供大家参考。

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); // 递归打印右子树
    }
}

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客李华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值