如何从字符串表达式构建二叉树
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 从括号字符串中构建二叉树
二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串
二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串