对树类算法问题的一种通用解法

目前前端面试中考察算法知识,

对性能并没有很高要求,主要还是看你能不能答出来。

况且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对应的结点归到一起,以拿到最终结果。

posted @ 2020-06-09 23:32  hh9515  阅读(162)  评论(0)    收藏  举报