分治遞歸的思想
遞歸問題兩個條件: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);
}