二叉樹基礎面試題1(力扣)

分治遞歸的思想

遞歸問題兩個條件:1、子問題(一顆樹分成3個部分:根+左子樹+右子樹)   2、返回條件(空樹)

1.單值二叉樹

題目描述:如果二叉樹每個節點都具有相同的值,那麼該二叉樹就是單值二叉樹。

只有給定的樹是單值二叉樹時,才返回 true;否則返回 false

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;

    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

2.  二叉樹的最大深度

題目描述:給定一個二叉樹,找出其最大深度。二叉樹的深度爲根節點到最遠葉子節點的最長路徑上的節點數。

說明: 葉子節點是指沒有子節點的節點。

必須後序遍歷方式

int maxDepth(struct TreeNode* root){
    if(root==NULL)
    return 0;

    int leftDepth = maxDepth(root->left);
    int rightDepth = maxDepth(root->right);

    return leftDepth > rightDepth ? leftDepth+1 : rightDepth +1;

}

3. 翻轉二叉樹

思想:1. 空   返回   2. 非空   交換左右孩子  繼續翻轉左右字數

struct TreeNode* invertTree(struct TreeNode* root){
    if(root==NULL)
    return NULL;

    struct TreeNode* tmp = root->right;
    root->right = root ->left;
    root->left =tmp;

    invertTree(root->left);
    invertTree(root->right);

    return root;

}

4. 檢查兩顆樹是否相同

題目描述:給定兩個二叉樹,編寫一個函數來檢驗它們是否相同。如果兩個樹在結構上相同,並且節點具有相同的值,則認爲它們是相同的。

兩顆樹相同 1、兩顆樹根的結構和值相同 2、兩顆樹的左右子樹相同

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL && q==NULL)
    return true;

    //結構不相同
    if(p==NULL || q== NULL)
    return false;
    
    //p和q都不爲空,值不同
    if(p->val != q->val)
    return false;

    //根的結構和值都相同,繼續去判斷左右子樹s是否相同
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);

}

 5.對稱二叉樹

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

對稱: 將左子樹和右子樹看作兩棵樹,比較左子樹的左子樹是否和右子樹的右子樹是否相同。 

bool _isSymmetric(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL && q==NULL)
    return true;

    //結構不相同
    if(p==NULL || q== NULL)
    return false;
    
    //p和q都不爲空,值不同
    if(p->val != q->val)
    return false;

    //根的結構和值都相同,繼續去判斷左右子樹s是否相同
    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);

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章