牛客剑指Offer面试题55:二叉树的深度(题目2:平衡二叉树)

题目描述

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

思路

1.暴力法(会重复遍历多个节点,效率较低)
2.后序遍历(从叶向根,从下向上,每个节点只遍历一次)
遍历到一个节点之前,已经遍历了它的左右子树.在遍历每个节点的时候记录它的深度,一边遍历以便判断该节点是否平衡

注意:
函数声明的参数是引用类型(树的高度)然后直接传入树的高度变量,因为每次递归的过程中树的高度都再变大,需要真正改变实参的值
书中代码是声明函数参数为指针类型,然后传入的参数为地址传递

代码

class Solution {
public:
    bool IsBalanced_Solution(TreeNode* pRoot) {
        //记录递归过程中树的总高度
        int depth = 0;
        return isBalanced(pRoot, depth);
    }
    
private:
    bool isBalanced(TreeNode* pRoot, int& depth)
    {
        //遍历至叶节点
        if(pRoot == nullptr)
        {
            depth = 0;
            return true;
        }
        //声明变量记录左右子树高度
        int left, right;
        //若当前节点左右子树均为平衡二叉树
        if(isBalanced(pRoot->left, left) && isBalanced(pRoot->right, right))
        {
            //定义变量记录左右子树高度差
            int diff = left - right;
            //计算左右子树高度差
            if(diff >= -1 && diff <= 1)
            {
                //树的高度更新为左右子树高度较大的那个值再加1
                depth = 1 + ((left > right) ? left : right);
                return true;
            }
        }
        return false;
    }
};
发布了65 篇原创文章 · 获赞 0 · 访问量 2030

猜你喜欢

转载自blog.csdn.net/ljmiiianng/article/details/103836577