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

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的深度(平衡二叉树)相关的知识,希望对你有一定的参考价值。

题目

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

思路

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

#include <iostream>
using namespace std;

struct tree
{
    double data;
    struct tree *left,*right;
    tree(int d=0):data(d)
    {
        left=right=nullptr;
    }
};
class Solution
{
    public:
        void create(tree *&root);
        int depth(tree *root);
        tree *root;    
};
void Solution::create(tree *&root)
{
    double x;
    cin>>x;
    if(x==0)
        root=nullptr;
    else
    {
        root=new tree();
        root->data=x;
        create(root->left);
        create(root->right);
    }
}
int Solution::depth(tree *root)
{
    if(!root)
        return 0;
        
    int left=depth(root->left);
    int right=depth(root->right);
    
    return max(left,right)+1;
}
int main()
{
    Solution s;
    s.create(s.root);
    cout<<s.depth(s.root)<<endl;
    return 0;
}

题目

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

思路

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

#include <iostream>
#include <cmath>
using namespace std;

struct tree
{
    double data;
    struct tree *left,*right;
    tree(int d=0):data(d)
    {
        left=right=nullptr;
    }
};
class Solution
{
    public:
        void create(tree *&root);
        int depth(tree *root);
        bool is_balance(tree *root);
        bool is_balance(tree *root,int &n);
        tree *root;    
};
void Solution::create(tree *&root)
{
    double x;
    cin>>x;
    if(x==0)
        root=nullptr;
    else
    {
        root=new tree();
        root->data=x;
        create(root->left);
        create(root->right);
    }
}
bool Solution::is_balance(tree *root)
{
    if(!root)
        return false;
    int n=0;
    return is_balance(root,n);
}
bool Solution::is_balance(tree *root,int &n)
{
    if(!root)
    {
        n=0;
        return true;
    }
    int left=0,right=0;
    if(is_balance(root->left,left)&&is_balance(root->right,right))
    {
        int diff=left-right;
        if(abs(diff)<=1)
        {
            n=max(left,right)+1;
            return true;
        }
    }
    return false;
}
int main()
{
    Solution s;
    s.create(s.root);
    cout<<boolalpha<<s.is_balance(s.root)<<endl;
    return 0;
}

 

以上是关于二叉树的深度(平衡二叉树)的主要内容,如果未能解决你的问题,请参考以下文章

Java 剑指offer(55-2) 平衡二叉树

剑指Offer对答如流系列 - 二叉树的深度

平衡二叉树的旋转

python代码计算二叉树的深度

具有N个结点的平衡二叉树的深度一定不小于logn对么?为啥

平衡二叉树