class Node {
constructor(value, left, right) {
this.value = value;
this.left = left;
this.right = right;
}
}
let n1 = new Node(1, null, null);
let n2 = new Node(2, null, null);
let n4 = new Node(4, n1, n2);
let n6 = new Node(6, null, null);
let root = new Node(5, n4, n6);
function fn1(node) {
if (node == null) return 0
let 左子树节点个数 = fn1(node.left)
let 右子树节点个数 = fn1(node.right)
let 中间节点个数 = 1
return 左子树节点个数 + 右子树节点个数 + 中间节点个数
}
console.log('递归实现', fn1(root))
function fn2(root) {
let result = 0
let queue = []
queue.push(root)
while (queue.length) {
let size = queue.length
result += size
while (size--) {
let node = queue.shift()
node.left && queue.push(node.left)
node.right && queue.push(node.right)
}
}
return result
}
console.log('迭代实现', fn2(root))
function fn3(node) {
if (node === null) {
return 0
}
let 左节点数 = 0
let 右节点数 = 0
let left = node.left
while (left) {
左节点数++
left = left.left
}
let right = node.right
while (right) {
右节点数++
right = right.right
}
if (左节点数 === 右节点数) {
return Math.pow(2, 左节点数 + 1) - 1
}
return fn3(node.left) + fn3(node.right) + 1
}
console.log('利用满二叉树特性', fn3(root))
console