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


題目

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

思路

  如果一棵樹只有一個結點,它的深度為1,如果根節點只有左子樹而沒有右子樹,那么樹的深度應該是其左子樹的深度+1.同樣如果根節點只有右子樹而沒有左子樹,那么樹的深度應該是其右子樹+1.如果既有左子樹又有右子樹,那概述的深度就是左、右子樹的深度的較大值加1。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    int TreeDepth(TreeNode* root)
    {
        if(!root)
            return 0;
        int leftDepth=TreeDepth(root->left);
        int rightDepth=TreeDepth(root->right);
        
        return max(leftDepth,rightDepth)+1;
    }
};

題目

  輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。

思路

  如果像去求二叉樹的深度那樣,先判斷根節點是不是平衡的,在判斷根的左右子樹是不是平衡的,這樣的話,會重復遍歷很多節點(根的左右子樹的子樹),所以可以用后序遍歷,遍歷到根結點之前已經先遍歷了左右子樹,只需要在便利每個結點的時候記錄它的深度,就可以一遍遍歷一邊判斷每個節點是不是平衡的。

class Solution {
public:
    bool IsBalanced_Solution(TreeNode* root) {
        if(!root)
            return true;
        
        return IsBalanced_Solution_Core(root,0);
    }
private:
    bool IsBalanced_Solution_Core(TreeNode *root,int n)
    {
        if(!root)
        {
            n=0;
            return true;
        }
        int left=0,right=0;
        if(IsBalanced_Solution_Core(root->left,left)&&IsBalanced_Solution_Core(root->right,right))
        {
            int diff=left-right;
            if(abs(diff)<=1)
            {
                n=max(left,right)+1;
                return true;
            }
        }
        return false;
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM