Leetcode 题组 26(二叉树)

222. 完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例 1:

输入:root = [1,2,3,4,5,6]
输出:6

分析:

这个题按照正常递归或者层序遍历都可以写,不过因为是完全二叉树,因此可以使用完全二叉树的性值:满二叉树的节点个数为2^N-1,其中N表示层数(root节点为第1层)。

 我们可以判断当前节点是否为满二叉树,如果是,就可以返回从这个节点到下面所有节点的个数,如果不是,就需要递归的寻找左子树个数和右子树个数。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        // 递归边界
        if (!root) return 0;
        // 判断该节点到下面所有节点是否能构成满二叉树
        TreeNode* left = root->left;
        TreeNode* right = root->right;
        int l_cot = 0, r_cot = 0;
        while(left) {
            left = left->left;
            ++l_cot;
        }
        while(right) {
            right = right->right;
            ++r_cot;
        }
        // 如果能构成满二叉树 返回 2^N-1
        if (l_cot==r_cot) {return pow(2,l_cot+1) - 1;}
        // 否则需要递归的寻找左子树和右子树的个数
        else return countNodes(root->left)+countNodes(root->right)+1;
    }
};

110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    int deep(TreeNode* node){
        if (!node) return 0;
        else return max(deep(node->left), deep(node->right))+1;
    }

    bool isBalanced(TreeNode* root) {
        if (!root) return true;
        int l_cot = deep(root->left);
        int r_cot = deep(root->right);
        return abs(l_cot-r_cot)<=1 && isBalanced(root->left) && isBalanced(root->right);
    }
};

 257. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。
示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    void dfs(TreeNode* node, vector<string>& ans, string path){
        path = path + "->" + to_string(node->val);
        if (!node->left&&!node->right) {
            ans.push_back(path);
            return;
        }
        if (node->left) dfs(node->left, ans, path);
        if (node->right) dfs(node->right, ans, path);
    }

    vector<string> binaryTreePaths(TreeNode* root) {
        if (!root) return {};  
        if (!root->left&&!root->right) return {to_string(root->val)};
        vector<string> ans;
        if (root->left) dfs(root->left, ans, to_string(root->val));
        if (root->right) dfs(root->right, ans, to_string(root->val));
        return ans;
    }
};