目錄
1. 單值二叉樹
1.1 題目鏈接與描述
1.2 解題思路
1.3 程序
2. 相同的樹
2.1 題目鏈接與描述
2.2 解題思路
2.3 程序
3. 對稱二叉樹
3.1 題目鏈接與描述
3.2 解題思路
3.3 程序
1. 單值二叉樹
1.1 題目鏈接與描述
題目鏈接:
965. 單值二叉樹 - 力扣(LeetCode)
題目描述:
如果二叉樹每個節點都具有相同的值,那么該二叉樹就是單值二叉樹。
只有給定的樹是單值二叉樹時,才返回?true
;否則返回?false
。
1.2 解題思路
思路1:遍歷法,遍歷二叉樹進行值的對比,若全部值相同則返回true,否則返回false;
思路2:分治法:
如果二叉樹為空,則返回true;
如果二叉樹非空,則依次將當前根結點的值與左右孩子結點的值進行比較,不等則返回false;
1.3 程序
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
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. 相同的樹
2.1 題目鏈接與描述
題目鏈接:
100. 相同的樹 - 力扣(LeetCode)
題目描述:
給你兩棵二叉樹的根節點?p
?和?q
?,編寫一個函數來檢驗這兩棵樹是否相同。
如果兩個樹在結構上相同,并且節點具有相同的值,則認為它們是相同的。
2.2 解題思路
分治思想,兩棵樹的根與根相比,左子樹與左子樹比較,右子樹與右子樹比較,對于每一棵子樹,仍然采用根、左子樹、右子樹的順序進行比較。
2.3 程序
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
bool isSameTree(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 isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
3. 對稱二叉樹
3.1 題目鏈接與描述
題目鏈接:
101. 對稱二叉樹 - 力扣(LeetCode)
題目描述:
給你一個二叉樹的根節點?root
?, 檢查它是否軸對稱。
3.2 解題思路
除根結點外,從第二層子樹開始,根與根比較,一個根結點的左子樹與另一個根結點的右子樹比較,一個根結點的右子樹與另一個根結點的左子樹比較。
與第二題思路類似,為了更方便實現兩棵子樹的對稱比較,再封裝一個函數isSubSymmic,將第二層的兩個結點指針作為參數傳遞給該函數。
3.3 程序
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
bool isSubSymmetric(struct TreeNode* leftTreeNode,struct TreeNode* rightTreeNode){if (leftTreeNode == NULL && rightTreeNode == NULL)return true;if (leftTreeNode == NULL || rightTreeNode == NULL)return false;if (leftTreeNode->val != rightTreeNode->val)return false;return isSubSymmetric(leftTreeNode->left, rightTreeNode->right)&&isSubSymmetric(leftTreeNode->right, rightTreeNode->left);
}
bool isSymmetric(struct TreeNode* root) {if (root == NULL)return true;return isSubSymmetric(root->left,root->right);
}