题目三:
解法一:(递归、DFS、后续遍历)- 普通二叉树
解题思路:类似于求最大深度。
递归
- 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。
代码如下:
var getNodesNum = function(cur) {
- 确定终止条件:如果为空节点的话,就返回0,表示节点数为0。
代码如下:
if (cur == NULL) return 0;
- 确定单层递归的逻辑:先求它的左子树的节点数量,再求的右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。
代码如下:
let leftNum = getNodesNum(cur->left); // 左
let rightNum = getNodesNum(cur->right); // 右
let treeNum = leftNum + rightNum + 1; // 中
return treeNum;
var countNodes = function(root) {
if (root === null) return 0
let leftNodes = countNodes(root.left)
let rightNodes = countNodes(root.right)
return leftNodes + rightNodes + 1
};
解法二:(层序遍历) - 普通二叉树
var countNodes = function(root) {
if (root === null) return 0
let queue = [root]
let count = 0
while(queue.length) {
let length = queue.length
for (let i = 0; i < length; i++){
let node = queue.shift()
count++
node.left && queue.push(node.left)
node.right && queue.push(node.right)
}
}
return count
};
解法三:递归 - 完全二叉树
var countNodes = function(root) {
//利用完全二叉树的特点
if(root===null){
return 0;
}
let left=root.left;
let right=root.right;
let leftDepth=0,rightDepth=0;
while(left){
left=left.left;
leftDepth++;
}
while(right){
right=right.right;
rightDepth++;
}
if(leftDepth==rightDepth){
return Math.pow(2,leftDepth+1)-1;
}
return countNodes(root.left)+countNodes(root.right)+1;
};