[LeetCode] Symmetric Tree

####一、題目名稱 101. Symmetric Tree https://leetcode.com/problems/symmetric-tree/ ####二、題目內容算法

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

翻譯: 給定一顆二叉樹,檢查它是否與本身的鏡像是同一棵樹(圍繞根節點對稱)函數


####三、解題思路 1性能

觀察規律 從最簡單開始別怕麻煩 從1個節點到 三層end
什麼樣的狀況符合條件
    1 若是2個節點都不存在
    2 若是2個節點存在一個 (跟節點值沒有關係)
    
	3 若是2個節點都存在而且內容相等爲對稱

什麼樣的狀況不符合條件

判斷一個root是否對稱 步驟 1 若是root節點的左右兩個節點 p1= root->left p2=root-rgiht 都存在 而且數組相等測試

步驟 2 知足條件 1 判斷P1 和p2 這2個節點是知足對稱條件 p3=P1->left 和p4=p2-right p5=p1-right 和p6=p2 -left翻譯

步驟 3 知足條件 2 判斷 p3 和p4,p5和p6這2個節點是是否對稱 重複步驟 1和2code

class Solution { public:遞歸

bool check(TreeNode *leftNode, TreeNode *rightNode)
    {   
         //01 判斷2個節點是否對稱
        //2個節點都爲空
        if (leftNode == NULL && rightNode == NULL)
        {    
            return true;
        }
        //2個節點不對稱--結構不對稱
        if (leftNode == NULL || rightNode == NULL)
        {    
            return false;
        }
        //2個節點不對稱--內容不相等
        if(leftNode->val != rightNode->val)
        {
            return false;
        }
        //02 左右節點的之樹也是對稱的
        return  check(leftNode->left, rightNode->right) && 
                check(leftNode->right, rightNode->left);
    }

/*************************************************
Function: 101. Symmetric Tree
Description:    // 函數功能、性能等的描述
Input:          // 輸入參數說明,包括每一個參數的做
              // 用、取值說明及參數間關係。
Output:         // 對輸出參數的說明。
Return:         // 函數返回值的說明
Others:     troy 2016.4.7
*************************************************/
bool isSymmetric(TreeNode* root) 
{

    if (root == NULL)
    {  
        return true;
    }
        
    return check(root->left, root->right);
}

};隊列

####四、解題思路 2
本身大腦是如何思考的 上面case注意ip

1 /
2 2 / \ /
3 4 4 3

第一次對比: 2和2 節點 符合條件 第二次對比:3和3節點 符合條件 第三次對比:4和4節點 符合條件

第四次對比:NULl NULL 符合條件 第五次對比:NULl NULL 符合條件

問題來了 軌跡 2 2 3 4 4 3 好像跟樹的層次遍歷順序相似 仔細對比一下 正確順序應該是 1 2 2 3 4 4 3 節點3和4 有經過根節點 不是 3 和3 屬於不相同的節點 一個隊列是解決不了這問題的就用2個隊列

兩個隊列的出隊順序 root節點左隊列A: 2 3 4 NULL NULL root節點右隊列 B :2 3 4 NULL NULL

1 /
2 2 \
3 3

第一次對比: 2和2 節點 符合條件 第二次對比:3和 Null節點 不對稱 退出

注意:若是節點是NUL也須要記錄下來 ,就是這麼死板 人一眼看出來,電腦記錄不下來

1 節點左隊列 A: 2 NULL
1 節點右隊列 B :2 3

實現步驟: 步驟 1 構造兩個隊列 leftQ,rightQ 分別表示左子樹遍歷順序 右子樹遍歷順序 步驟 2 按照層次遍歷 方法 若是2個隊列都不爲空 而後比較front 連個節點 什麼樣的狀況不符合條件 結構和內容都不對稱 步驟 3 重複步驟2 直到結束,若是方向2個隊列還有剩餘爲false

/************************************************* Function: 101. Symmetric Tree Description: 是否對稱 Input: root Output:
Return: true --對稱 false--不對稱 Others: troy 2016.4.7 *************************************************/ bool isSymmetric2(TreeNode *root) { //若是root爲null 直接返回 if(root==NULL) { return true;
}

queue<TreeNode*> leftQ;//leftQ  保存左子樹遍歷順序
queue<TreeNode*> rightQ;//rightQ 保存右子樹遍歷順序

leftQ.push(root->left); 
rightQ.push(root->right);
       
TreeNode* l;
TreeNode* r;
while(!leftQ.empty() && !rightQ.empty())
{
    l = leftQ.front();
    leftQ.pop();
    r = rightQ.front();
    rightQ.pop();
    
    if(l == NULL && r == NULL) continue;//上面算法若是NULL 返回true 爲葉子結點 繼續遍歷
    if(l == NULL || r == NULL) return false;//結構不對稱
    if(l->val != r->val) return false;//數值不對稱
   
   //注意如隊列順序 觀察出來的 3=3  4 =4 
    leftQ.push(l->left);//左 3 右 4
    leftQ.push(l->right);
    rightQ.push(r->right);//右 3 左4 
    rightQ.push(r->left);
}

//若是還有剩餘說明不結構不對稱 例如 root只有一個
if(!leftQ.empty() || !rightQ.empty())
{
    return false;
} 
return true;

} ####五、解題思路 3

  • [x] 一顆tree 我按照必定順序遍歷完畢,而後觀察規律 這個方法不可取 由於存儲結構是二叉樹 不是數組即便有規律NULL沒法完成保存下來 不能夠

  • [x] 一顆tree是對稱樹 那麼左右子樹遍歷順序結果是同樣的

    1 /
    2 2 / \ /
    3 4 4 3

1 左節點中須遍歷順序 3 2 4 1 右節點中隊列 B : 2 4 3 不能夠

1 左節點後須遍歷順序 3 4 3
1 右節點後須遍歷順序 : 3 4 2 不能夠

1 左節點中須遍歷順序 3 4 2
1 右節點後須遍歷順序 : 3 4 2 能夠

缺點:必須徹底遍歷完畢才能夠知道 遍歷過程當中沒法比較

####六、 測試用例

Your input [1,2,2,#,#,3] Your answer false Expected answer false Runtime: 0 ms

####七、 總結 若是沒有推理 ,記住結論 狀況一邊就仍然不會 難點: 假如i,j2個節點 判斷是否對稱很容易 內容同樣 若是擺脫tree這麼多層次位置,集中到2個節點上進行比較 手工去演示過程 最直接解題思路 必需要完整去演示過程 若是演示不過 說明思路有問題。 遇到問題:

  • [ ] book 上說遍歷(先,中,後) 都是參數都是一個節點,如今變成2個節點了 不知道該如何辦了 對稱 確定是2個節點進行比較

  • [ ] 還有是遍歷都(遞歸方式 仍是非遞歸)記錄上下節點位置(父子) 左右節點位置很差記錄 (孩子之間)

相似題目: 104. Maximum Depth of Binary Tree Next challenges: (M) Convert Sorted List to Binary Search Tree (M) Graph Valid Tree (E) Closest Binary Search Tree Value

相關文章
相關標籤/搜索