#試題28:對稱的二叉樹
題目:
請設計一個函數判斷一棵二叉樹是否 軸對稱 。
示例 1:
輸入:root = [6,7,7,8,9,9,8]
輸出:true
解釋:從圖中可看出樹是軸對稱的。
示例 2:
輸入:root = [1,2,2,null,3,null,3]
輸出:false
解釋:從圖中可看出最后一層的節點不對稱。
思路:
1.中序遍歷是左中右,所以初步想法是使用中序遍歷把二叉樹遍歷一遍添加到容器中,這時候要把空著的節點以null的形式添加進容器,針對這種[1,2,2,2,null,2]
樹結構,然后把容器分為兩段比較他們的值,從而得出是否是對稱二叉樹
2.書中的想法是使用迭代的思路,將比較左右兩個節點,判斷他們的情況一共有四種情況,都為空true
,一個為空一個不為空false
,值不一樣false
,值一樣則繼續判斷左節點的左子節點與右節點的右子節點情況&&
左節點的右子節點與右節點的左子節點情況
代碼:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool check(TreeNode* root_left,TreeNode* root_right){if(root_left==nullptr&&root_right==nullptr)return true;if(root_left==nullptr || root_right==nullptr)return false;if(root_left->val!=root_right->val)return false;return check(root_left->left,root_right->right) && check(root_left->right,root_right->left);}bool checkSymmetricTree(TreeNode* root) {return check(root,root);}
};
leetcode101題
考點:
- 考察對二叉樹的理解,實質上是利用樹的遍歷算法解決問題。
- 考察思維能力,樹的對稱是一個抽象的概念,需要微秒在短時間內清楚判斷對稱的步驟并轉化為代碼