二叉树深度到判断平衡二叉树

(leetcode)104. 二叉树的最大深度(面试题39)用递归实现即可!!!

注:本文部分内容代码和思路是根据《剑指offer》中的面试题所得!

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

解答代码(C语言)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int maxDepth(struct TreeNode* root) {
    if(!root)   return 0;
    int lenL = maxDepth(root->left);
    int lenR = maxDepth(root->right);
    return (lenL >= lenR ?lenL : lenR)+1;
}

二叉平衡树(又称AVL树)

一棵二叉平衡树或者是空树,或者是具有下列性质的二叉排序树:

1。左子树和右子树都是二叉平衡树,

2。左子树和右子树的高度之差的绝对值不超过1

判断一棵树是否为平衡二叉树,只需遍历每一个节点,如果左子树和右子树的高度之差的绝对值不超过1,那么就是平衡二叉树

改写以上代码!!!

bool isBalanced(struct TreeNode* root) {
    if(!root)   return true;
    int lenL = Depth(root->left);
    int lenR = Depth(root->right);
    if((lenL-lenR) > 1 || (lenL-lenR) < -1)    return false;
    return isBalanced(root->left) && isBalanced(root->right);
}

上述代码在执行的过程中,有太多的重复,就像斐波那契数列的计算一样。

主要是Depth函数被多个节点重复执行!!!

其实无论是链表、数组操作,还是树的遍历,面试官都希望你能在遍历一次后解决问题!!!

更好的解法是:后序遍历树节点时记下它的深度,一边遍历一边判断是否每个节点平衡

bool isBalanced(struct TreeNode* root, int*Depth) {
    if(!root){
        *Depth = 0;
        return true;
    }  
    int left, right;
    if(isBalanced(root->left, &left) && isBalanced(root->right, &right)){
        if((left-right) <=1 && (left-right) >= -1){
            *Depth = 1 + (left > right ? left : right);
            return true; 
        }
    }
    return false;
}

上面的代码中用后序遍历访问整棵树节点,这里计算每个节点的深度方法更加巧妙,

根据节点的左右子树的深度判断结果和相应的深度来获得当下节点的深度!!!

这种自底向上的判断结果消除了很多重复的计算!!!

虽然我们函数执行的入口是从根节点root进入的,但是在执行的过程中是从判断最底层的叶子节点开始向上执行的!!!

欢迎大家评论和提出意见!!!

猜你喜欢

转载自blog.csdn.net/liuxiang15/article/details/82263582