二叉树的深度(平衡二叉树)

题目

  输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

思路

  如果一棵树只有一个结点,它的深度为1,如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度+1.同样如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树+1.如果既有左子树又有右子树,那概述的深度就是左、右子树的深度的较大值加1。

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

        int leftDepth = maxDepth(root->left);
        int rightDepth = maxDepth(root->right);
        return max(leftDepth, rightDepth) + 1;a
    }
};

题目

  输入一棵二叉树,判断该二叉树是否是平衡二叉树。

思路

  如果像去求二叉树的深度那样,先判断根节点是不是平衡的,在判断根的左右子树是不是平衡的,这样的话,会重复遍历很多节点(根的左右子树的子树),所以可以用后序遍历,遍历到根结点之前已经先遍历了左右子树,只需要在便利每个结点的时候记录它的深度,就可以一遍遍历一边判断每个节点是不是平衡的。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isBalanced(TreeNode* root) {
        if (root == nullptr) {
            return true;
        }

        int height = 0;
        return isBalancedCore(root, height);
    }
private:
    bool isBalancedCore(TreeNode *root, int &height) {
        if (root == nullptr) {
            height = 0;
            return true;
        }

        int left = 0, right = 0;
        if (isBalancedCore(root->left, left) && isBalancedCore(root->right, right)) {
            int diff = abs(left - right);
            if (diff <= 1) {
                height = max(left, right) + 1;
                return true;
            }
            return false;
        }
        return false;
    }
};

 

posted on 2019-01-14 21:52  tianzeng  阅读(2494)  评论(0编辑  收藏  举报

导航