力扣(二叉樹、C語言)單值二叉樹、二叉樹的深度、對稱二叉樹

1、單值二叉樹

力扣965題:單值二叉樹

題目:如果二叉樹每個節點都具有相同的值,那麼該二叉樹就是單值二叉樹。只有給定的樹是單值二叉樹時,才返回 true;否則返回 false。

示例

分析:1、判斷樹的根節點是否爲空,爲空則爲單值二叉樹,返回true;2、此時樹不爲空,分別判斷根節點左孩子節點和右孩子節點值是否不等於根節點,不等於則返回false;3、此時左右孩子節點和根節點的值一致,分別再將左右孩子作爲根節點進行遞歸。

代碼:

bool isUnivalTree(struct TreeNode* root){
    if(root==NULL)
        return true;
    if(root->left && root->left->val != root->val)
        return false;
    if(root->right && root->right->val != root->val)
        return false;
    //root->left   root->right 都是相等的
    //遞歸左子樹  遞歸右子樹
    //對左右子節點作爲根節點進行遞歸
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

2、二叉樹深度

力扣55題:二叉樹深度

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

在這裏插入圖片描述

分析:1、判斷二叉樹是否爲空,爲空則深度爲0;2、此時二叉樹不爲空,通過遞歸二叉樹的左右子樹得到左右子樹的深度;3、判斷左右子樹較大的深度作爲子樹的深度,然後加上跟節點的深度1,得到最終二叉樹的深度。

代碼:

int maxDepth(struct TreeNode* root){
    if(root == NULL) //判空
        return 0;
    int leftDepth = maxDepth(root->left);  //遞歸左子樹
    int rihgtDepth = maxDepth(root->right);  //遞歸右子樹
 	//判斷左子樹和右子樹深度,將深度較大的加上根節點深度1
    return leftDepth > rihgtDepth?leftDepth+1:rihgtDepth+1; 
}

3、對稱二叉樹

力扣101題:對稱二叉樹

題目:給定一個二叉樹,檢查它是否是鏡像對稱的。

在這裏插入圖片描述

分析:對於對稱二叉樹,因爲代碼中只給出根節點,需要用到上一博客寫到的判斷相同二叉樹的函數,只不過此處判斷完根節點的左節點和有節點相等後,遞歸是時候需滿足左子樹的左節點和右子樹的右節點相同,且左子樹的右節點和右子樹的左節點值相同。

代碼:

bool _isSymmetric(struct TreeNode* p,struct TreeNode* q) //判斷兩樹相同的函數
{
    if(p==NULL && q==NULL)
        return true;
    if(p==NULL || q==NULL)
        return false;
    if(p->val != q->val)
        return false;
        //此時說明根節點的左右子樹節點相同
        //將左右子樹節點作爲根節點,通過遞歸判斷左子樹的左子樹的左節點和右子樹的右節點相同,且左			     子樹的右節點和右子樹的左節點值相同
     return _isSymmetric(p->left,q->right) && _isSymmetric(p->right,q->left);
}

bool isSymmetric(struct TreeNode* root){
    if(root == NULL)
        return true;
    return _isSymmetric(root->left,root->right);//調用判斷兩二叉樹相同的函數
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章