建設(shè)集團(tuán)公司網(wǎng)站百度域名查詢官網(wǎng)
今天我們一起來看一道判斷一棵樹是否為對稱二叉樹的題,力扣101題,
https://leetcode.cn/problems/symmetric-tree/
?我們首先先來分析這道題,要判斷這道題是否對稱,我們首先需要判斷的是這顆樹根節(jié)點的左右子樹是否對稱,所以我們比較對象是根節(jié)點的左右子樹,那我們不妨自己寫一個函數(shù)my_isSymmetric,參數(shù)就是
bool my_isSymmetric(struct TreeNode* leftroot,struct TreeNode* rightroot),我們用這個函數(shù)來判斷這棵樹的左右子樹是否對稱,首先我們要判斷如果
左右子樹都是空樹呢?也就是這棵樹只有一個根節(jié)點,這樣的話也還算對稱的,即
if(leftroot==NULL&&rightroot==NULL){return true;}
左右子樹都為空的情況判斷了,現(xiàn)在判斷有一邊為空的情況呢?肯定就不對稱了,即
if(leftroot==NULL||rightroot==NULL){return false;}
有人會疑問為什么這里的連接符號用||,注意,程序走到這里的前提是這棵樹的左右子樹不為空,即左右子樹兩邊不會同時為空,所以用||符號如果leftroot==NULL就不會走后面rightroot==NULL,如果leftroot!=NULL,走到后面判斷right==NULL是否為空,如果兩邊有一邊為空,這棵樹肯定就不對稱返回false;
下面,程序走過上面那一步那就證明左右子樹都不為空,那我們只需要判斷l(xiāng)eftroot的val和rightroot的val是否相等就可以了,如果不相等返回false,即
if(leftroot->val!=rightroot->val){return false;}
這個時候程序還沒有返回,那就是上述步驟都順利通過,那就遞歸判斷l(xiāng)eftroot的左子樹和righttoor的右子樹 和 leftroot的右子樹和right的左子樹是否相等就可以了,
即
return my_isSymmetric(leftroot->left,rightroot->right)&&my_isSymmetric(leftroot->right,rightroot->left);
這個函數(shù)到這里就封裝完畢了,我們只需要在給的isSymmetric下面調(diào)用自己的my_isSymmetric就可以啦,即
return my_isSymmetric(root->left,root->right);
?完整代碼
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
bool my_isSymmetric(struct TreeNode* leftroot,struct TreeNode* rightroot)
{if(leftroot==NULL&&rightroot==NULL)//判斷左右子樹是否都為空{(diào)return true;}if(leftroot==NULL||rightroot==NULL)//判斷是由有一邊為空{(diào)return false;}if(leftroot->val!=rightroot->val)//判斷左右子樹val是否相等{return false;}return my_isSymmetric(leftroot->left,rightroot->right)&&my_isSymmetric(leftroot->right,rightroot->left);//左子樹的左子樹和右子樹的右子樹比較,左子樹的右子樹和右子樹的左子樹比較,二者必須同時滿足;}
bool isSymmetric(struct TreeNode* root) {return my_isSymmetric(root->left,root->right);
}