题解 | #输出二叉树的右视图#
输出二叉树的右视图
http://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0
golang实现
简单的概括逻辑:
(1)根据前序,中序。把树上的所有数字遍历一遍,这时我们是可以知道当前的数字在tree中的层数的
(2)并根据数字在tree的层数,塞到对应的数组index中,最后得出的数组即为右视图。
因为是按照中序的顺序遍历的,最后势必右树的数字会覆盖同层左侧的数字,就达到了右视图的效果
package main func solve(xianxu []int, zhongxu []int) []int { // rightList 专门存放每层的数字,同层的数字会覆盖之前的记录 var rightList = []int{} rebuildTree(xianxu, zhongxu, 0, &rightList) return rightList } // level 树遍历的层数 list 存储树上每层最后一个数字 func rebuildTree(xianxu []int, zhongxu []int, level int, list *[]int) { if len(xianxu) == 0 { return } // 此处寻找中序中的root节点 var rootIndex = 0 for i := range zhongxu { if xianxu[0] == zhongxu[i] { rootIndex = i } } // 此处,把每层的数字都赋值到数组中,同层如果已有数字,会直接覆盖(因为被遮挡了嘛) if len(*list)-1 < level { *list = append(*list, xianxu[0]) } else { (*list)[level] = xianxu[0] } // 分别递归root的左树,每次递归时,说明已经是tree的下一层了,所以level需要+1 rebuildTree(xianxu[1:rootIndex+1], zhongxu[:rootIndex], level+1, list) // 分别递归root的右树 rebuildTree(xianxu[rootIndex+1:], zhongxu[rootIndex+1:], level+1, list) }