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;
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);
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);
}