LeetCode--110 平衡二叉树 ( Balanced Binary Tree )( C语言版 )

题目描述 :

LeetCode--110 平衡二叉树 ( Balanced Binary Tree )( C语言版 )_第1张图片

方法一:需要重复遍历节点多次解法,当遍历到一个节点时就将左右子树的的深度计算出来,然后判断是否满足条件

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
//计算出每个每个节点的深度
int TreeDepth(struct TreeNode* root)
{
    if(root==NULL)
        return 0;
    int left=TreeDepth(root->left);
    int right=TreeDepth(root->right);
    return (left>right)?left+1:right+1;
}
bool isBalanced(struct TreeNode* root) {
    if(root==NULL)
        return true;
    //计算左子树的高度
    int left=TreeDepth(root->left);
    //计算右子树的高度
    int right=TreeDepth(root->right);
    //计算左右子树的高度差
    int dif=abs(left-right);
    //判断高度差是否超过1,若超过则返回false
    if(dif>1)
        return false;
    //继续判断剩余节点是否满足高度平衡
    return isBalanced(root->left)&&isBalanced(root->right);
}

方法二:每个节点只遍历一次,采用后序遍历的方式,我们先判断左节点,左节点的左右都满足条件我们就给它加一,然后往上一层递归返回,然后进行右节点的计算,这样最后在进行根节点的计算。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool Balanced(struct TreeNode* root,int *pdepth)
{
    //若为空数直接返回
    if(root==NULL){
        *pdepth=0;
        return true;
    }
    //记录左右节点深度
    int left,right;
    //采用后序遍历,先遍历到最左边
    if(Balanced(root->left,&left)&&Balanced(root->right,&right)){
        //判断左右子树是否满足条件
        int dif=abs(left-right);
        if(dif<=1){
            //若满足条件就让自身加上子树的深度,当递归到上一层时,left和right就为左右子树高度
            *pdepth=1+(left>right?left:right);
            return true;
        }
    }
    return false;
}
bool isBalanced(struct TreeNode* root) {
    int pDepth=0;
    return Balanced(root,&pDepth);
}

 

你可能感兴趣的:(数据结构,C语言,LeetCode,二叉树)