问大家一个面试题

2019 年 9 月 6 日
 fenghuang

'1(2(3,4(,5)),6(7,))' 把这个字符串转成二叉树

     1
   /   \
  2     6
 / \   / \
3   4 7
     \
      5
6718 次点击
所在节点    程序员
37 条回复
yidinghe
2019 年 9 月 6 日
堆栈或者递归
mooyo
2019 年 9 月 7 日
递归处理子串
mooyo
2019 年 9 月 7 日
@mooyo 迭代不太好做吧
zsdsz
2019 年 9 月 7 日
前序遍历
rabbbit
2019 年 9 月 7 日
好像写麻烦了...
binux
2019 年 9 月 7 日
遇到空或者数字压栈,遇到 ) 弹出 3 个,分别是右左根,把根压回去。over
NVDA
2019 年 9 月 7 日
字符串是 preorder,把字符串先处理成数字和空的队列,然后 preorder 建树,队头如果为空返回空节点,否则新建一个 root 存 queue.poll(),递归建立左子树和右子树。

参考这个: https://leetcode.com/problems/serialize-and-deserialize-binary-tree/description/
unionx
2019 年 9 月 7 日
这个字符串就已经是二叉树了啊 —— Lisp 程序员
muzhidianzi
2019 年 9 月 7 日
小米面试 哈哈哈
Cooky
2019 年 9 月 7 日
@unionx 最外层没有括号,不能解析(
geelaw
2019 年 9 月 7 日
这是一个非常简单的 DPDA,用一个带有左右孩子和亲代节点指针的结构,从一个单独的根开始。
遇到数字:设置当前节点的值。
遇到左括号:建立并进入左子树。
遇到逗点:回到亲代,如果左子树没有值则删除之,建立并进入右子树。
遇到右括号:回到亲代,如果右子树没有值则删除之。
fenghuang
2019 年 9 月 7 日
@rabbbit #5 JS 语法有点看不懂。。。
fenghuang
2019 年 9 月 7 日
之前网上看到一个没有逗号,遇到逗号不知道怎么处理
NewDraw
2019 年 9 月 7 日
这是一个标准的前序遍历
cassyfar
2019 年 9 月 7 日
@binux 优雅
cassyfar
2019 年 9 月 7 日
@fenghuang 遇到逗号直接入栈
Lighfer
2019 年 9 月 7 日
初始状态默认是根节点
遇到数字,则为当前节点的值
遇到左括号,则进入当前节点的子节点,并默认赋值左子节点
遇到逗号,则切换到右兄弟节点
遇到右括号,则回到当前节点的父节点
所有如果不允许每个节点存储父节点信息,则需要有一个当前节点的父节点栈来记录
fenghuang
2019 年 9 月 7 日
@binux #6 试着写一下 谢谢
fenghuang
2019 年 9 月 7 日
@cassyfar #16 OK 我试一下
zealot0630
2019 年 9 月 7 日
topdown 文法,最容易实现的文法了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/598732

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX