如何从字符串表达式构建二叉树

Posted

技术标签:

【中文标题】如何从字符串表达式构建二叉树【英文标题】:How to Build a Binary Tree from a String Expression 【发布时间】:2021-11-26 05:36:21 【问题描述】:

给定一个这样的字符串,(((!D!)B!)A((!F(!H!))C(!G!))) 没有空格。如何构建二叉树?

我应该实现一个构造函数并使用索引节点遍历来构建它。这个字符串会输出

任何帮助/提示将不胜感激!!!

【问题讨论】:

请提供表达式的规范。一个例子是不够的。 【参考方案1】:

试试这个。

static Node parse(String input) 
    return new Object() 
        final int length = input.length();
        int index = 0;
        int ch = get();
        int get()  return ch = index < length ? input.charAt(index++) : -1; 

        Node node() 
            if (ch == '!') 
                get();
                return null;
             else if (ch == '(') 
                get();
                Node left = node();
                char data = (char)ch;
                get();
                Node right = node();
                if (ch != ')')
                    throw new RuntimeException("')' expected");
                get();
                return new Node(left, data, right);
             else
                throw new RuntimeException("'!' or '(' expected");
        

        Node parse() 
            Node node = node();
            if (ch != -1)
                throw new RuntimeException("extra string: " + input.substring(index - 1));
            return node;
        
    .parse();

public static void main(String[] args) 
    String input = "(((!D!)B!)A((!F(!H!))C(!G!)))";
    Node root = parse(input);
    System.out.println(root);

输出:

Node[left=Node[left=Node[left=null, data=D, right=null], data=B, right=null], data=A, right=Node[left=Node[left=null, data=F, right=Node[left=null, data=H, right=null]], data=C, right=Node[left=null, data=G, right=null]]]

【讨论】:

为什么是匿名内部类?解决方案不需要这种复杂性。【参考方案2】:

你可以使用递归解析:

public BinaryTree(String t) 
    this.root = parse(new StringReader(t));


private static Node parse(StringReader reader) 
    char c = (char)reader.read();
    if (c == '!')
        return null;
    if (c == '(') 
        Node left = parse(reader);
        char data = (char)reader.read();
        Node right = parse(reader);
        if (reader.read() != ')')
            throw new IllegalArgumentException();
        return new Node(left, data, right);
    
    throw new IllegalArgumentException();

【讨论】:

java.io.StringReader 已经存在。不用再写一篇了。 @user207421 解决了这个问题,谢谢

以上是关于如何从字符串表达式构建二叉树的主要内容,如果未能解决你的问题,请参考以下文章

536. Construct Binary Tree from String 从括号字符串中构建二叉树

二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串

二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串

二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串

通过输入字符串来构建二叉树

LeetCode根据二叉树创建字符串&&二叉树的构建以及遍历(递归)