请教递归,有兴趣同学进啊

2017-01-12 12:04:41 +08:00
 run2016

先谢谢各位大大~
如下一棵树:

       1
    /    \
   2      9
  / \    /  \
 3  4   5    6
   / \
  9  10    

传入一棵树头节点,导出的结果应该是从下往上 从左往右顺序的数组
上述的导出应该是[9,10,3,4,5,6,2,9,1]这样的数组

vector<int> tree_leaf(TreeNode* note) {
        
}

我考虑了个思路,但是没能写出运行成功的代码,希望前辈指教啊。。

在下最近被递归,特别是 递归中返回值利用 ,还有 临时的压栈值 给搞糊涂了,如果有相关的教程或者书籍推荐,在下真是不甚感激啊!!

3274 次点击
所在节点    程序员
27 条回复
Kilerd
2017-01-12 12:08:58 +08:00
按层遍历而已。挺简单的啊。请预习数据结构。😃😃😃
raysonx
2017-01-12 12:14:14 +08:00
从上往下,从右往左进行广度优先遍历,再逆序
run2016
2017-01-12 12:28:56 +08:00
@Kilerd
@raysonx
谢谢大大,这种遍历一般都是用队列循环思路。 请问这类问题用递归可解吗? 最近在练习这个。。
AlisaDestiny
2017-01-12 12:33:58 +08:00
循环+stack = 深度优先遍历(深搜)
循环+queue = 广度优先遍历(广搜)
Heinz
2017-01-12 13:21:58 +08:00
用栈更简单吧
run2016
2017-01-12 13:38:33 +08:00
@Heinz 怎么说?
markx
2017-01-12 13:45:15 +08:00
第一反应是用层序遍历, 然后把每一层的合起来就好了。 层序遍历嘛,就感觉用循环比较容易。 如果想要语法形式上的递归的话, 用一个新的函数,把循环的时候的变量作为参数传进函数就好了。好像这样就是尾递归而已,如果用不支持循环的语言来实现的话,可能就只能这样了。

如果形式上的递归还不够,一定要用递归的方法的话,我也没想到要怎么做……
mind3x
2017-01-12 16:52:17 +08:00
树的先序 /中序 /后序遍历,说层序什么的请重修数据结构,谢谢。
srlp
2017-01-12 17:11:27 +08:00
关键词 level order traversal dfs 。

代码可参考 https://siddontang.gitbooks.io/leetcode-solution/content/tree/binary_tree_level_order_traversal.html
最后把 vector of vector 压扁即可。

具体说到你的思路,在这题目中不需要返回值,因为你不需要把东西返回给上一层,一直向下遍历把数字塞到 vector of vector 内部就可以了(因为你最后才把 vector of vector 拍扁)。你需要实现的是这么一个递归函数 void dfs(vector<vector<int>> &array, TreeNode *node, int curr_level)
lrigi
2017-01-12 17:54:27 +08:00
递归的话,先序 /中序 /后序 遍历整颗树
然后对每个节点的深度进行标号 入队
然后按深度 1234 逐个出队就好了吧
czheo
2017-01-12 21:01:27 +08:00
bfs 用递归不是蛋疼嘛? 乖乖循环多好。
https://gist.github.com/czheo/92fafe0dd18e05d41d71e36bfd0b04e1
markx
2017-01-12 22:14:12 +08:00
@mind3x 那要请教 Level Order Tree Traversal 是该用先序、中序还是后序呢?
neosfung
2017-01-12 22:58:20 +08:00
@mind3x 挺好奇按照你说的这三种方法怎样输出楼主的结果
zhy0216
2017-01-13 08:00:17 +08:00
BFS 啊 朋友...
mind3x
2017-01-13 17:48:04 +08:00
@markx
@neosfung

这个问题里面只要确保同一个节点的子节点访问顺序是先左后右,用先 /中 /后序遍历都可以,只是在 DFS 递归时要额外携带当前深度信息,以及按深度区分的二维结果数组,遍历完成后组合结果即可。
mind3x
2017-01-13 18:01:40 +08:00
@neosfung
@markx

用 BFS 非递归实现也可以。如果不考虑移出队列的操作, BFS 时所使用的队列中最后的内容其实已经接近这题目所要求的结果,只是在按层数排列上是相反的。
实做的时候,在 BFS 中增加一个额外的二维数组,每次有节点放进 BFS 队列时同时更新这个二维数组即可。
实现效率上因为是迭代式的,会比递归算法高效很多。
neosfung
2017-01-13 18:30:39 +08:00
@mind3x czheo 同学给出的方法就是先右后左哦。我挺奇怪的是,回复问题只说访问子节点的顺序,算是解决问题了么?
mind3x
2017-01-13 19:13:22 +08:00
@neosfung 大概你没仔细看,我说的是在 DFS 递归实现时需要先左后右。 @czheo 给出的是在 BFS 时通过先右后左的办法,最后再一次 reverse ,既解决了我上面说的正常 BFS 时层数顺序相反的问题,也无需用到二维数组。
至于我最开始的回复,只是吐槽层序这个说法而已。
markx
2017-01-14 02:47:26 +08:00
@mind3x 层序这个说法有什么可以吐槽的呢?
czheo
2017-01-14 07:41:25 +08:00
你们到底在瞎逼逼啥,我不是都给出答案了吗, bfs 十行代码的问题。 talk is cheap 。。。

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

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

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

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

© 2021 V2EX