1. 程式人生 > >【leetcode 二叉樹對稱判斷】Symmetric Tree

【leetcode 二叉樹對稱判斷】Symmetric Tree

1、題目

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following is not:

    1
   / \
  2   2
   \   \
   3    3

2、分析

判斷一棵二叉樹本身是否是映象對稱的,這個問題可以轉化為:二叉樹的左子樹與右子樹是否是映象對稱的。
問題一經轉化,就有一種似曾相識的感覺,上一篇文章剛分析過判斷兩棵二叉樹是否相等的問題,而這道題只不過是把“相等”換為“對稱”,方法其實是一樣的! 本題的解法同樣有遞迴和迭代兩種方法: (設二叉樹左子樹為p,右子樹為q,p、q均指向左右子樹的根) 遞迴:p和q的值相等,並且p的左子樹與q的右子樹對稱,p的右子樹與q的左子樹對稱 迭代:維護一個棧,方法與上一篇文章中判斷二叉樹是否相等類似,只不過,我們在將節點入棧的時候,順序不是     p->left , q->left ,p->right ,q->right,而是p->left , q->right , p->right ,q->left,為什麼?因為我們要判斷的是對稱,所以p->left 對應q->right,p->right 對應q->left,它們的入棧順序理應如此。

3、程式碼

#遞迴

<span style="font-size:18px;">/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode *root) {
       if(!root) return true;   //空樹是對稱的
       return symmetric(root->left,root->right);
    }
private:
   bool symmetric(TreeNode *p,TreeNode *q)       /*判斷兩棵樹是否對稱*/
   {   
       if(!p && !q) return true;       //都是空
       if(!p || !q) return false;      //只有一個空
       return (p->val==q->val)&&symmetric(p->left,q->right) && symmetric(p->right,q->left);   
       /*樹p和樹q對稱的條件:p和q的值相同,並且p的左子樹與q的右子樹對稱,p的右子樹與q的左子樹對稱*/
   }
};</span>


#迭代

<span style="font-size:18px;">/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode *root) {
      if(!root) return true;   //空樹是對稱的
      stack<TreeNode *> s;
      TreeNode *p=root->left,*q=root->right;
      s.push(p);
      s.push(q);        //即使是空節點,也是可以push到棧裡的,棧並不為空。
      while(!s.empty())
      {
          p=s.top();s.pop();
          q=s.top();s.pop();
          
          if(!p && !q) continue;            //p、q都是空節點
          if(!p || !q) return false;        //有一個為空,不對稱
          if(p->val!=q->val) return false;  //值不相等,不對稱
          
          s.push(p->left);s.push(q->right);
          s.push(p->right);s.push(q->left);
      }
      return true;
    }

};</span>