【算法16天:Day16】第六章二叉树 LeetCode 完全二叉树的结点个数(222)

89 阅读1分钟

题目三:

image.png

解法一:(递归、DFS、后续遍历)- 普通二叉树

解题思路:类似于求最大深度。

递归

  1. 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。

代码如下:

var getNodesNum = function(cur) {
  1. 确定终止条件:如果为空节点的话,就返回0,表示节点数为0。

代码如下:

if (cur == NULL) return 0;
  1. 确定单层递归的逻辑:先求它的左子树的节点数量,再求的右子树的节点数量,最后取总和再加一 (加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;
};