对树类算法问题的一种通用解法
目前前端面试中考察算法知识,
对性能并没有很高要求,主要还是看你能不能答出来。
况且js这种动态语言的优势本身就是描述动作,而不是C++一样重在描述过程(压榨性能)
对树类问题如求叶子节点,求树高度,求树哪一层个数最多,找到一种通用解法:
1,首先先遍历树,为树的数据结构添加一些辅助属性,如parent,depth,
2, 接下来再次遍历树就可以轻松解决上面这些些算法问题
如:求某层最多的节点数
let A = {}
let B = { val: '', leftChild: undefined, rightChild: undefined }
let C = { val: '', leftChild: undefined, rightChild: undefined }
let D = { val: '', leftChild: undefined, rightChild: undefined }
let E = { val: '', leftChild: undefined, rightChild: undefined }
let F = { val: '', leftChild: undefined, rightChild: undefined }
A = {
val: 'A',
leftChild: B,
rightChild: C
}
B.val = 'B'
B.leftChild = D
B.rightChild = E
C.val = 'C'
C.leftChild = F
C.rightChild = undefined
D.val = 'D'
D.leftChild = undefined
D.rightChild = undefined
E.val = 'E'
E.leftChild = undefined
E.rightChild = undefined
F.val = 'F'
F.leftChild = undefined
F.rightChild = undefined
A是顶结点

在第一次遍历中,我们为树的每个结点标记了depth属性,
接下来再一次遍历中就可以将某个depth对应的结点归到一起,以拿到最终结果。