1. 程式人生 > >二叉樹的深度(平衡二叉樹)

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

題目

  輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。

思路

  如果一棵樹只有一個結點,它的深度為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;
}