1. 程式人生 > >劍指offer面試題[59]-對稱的二叉樹

劍指offer面試題[59]-對稱的二叉樹

題目描述

請實現一個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot)
    {
        if(pRoot==NULL)
            return true;
        TreeNode* p1=pRoot;
        TreeNode* p2=pRoot;
        PreSymmetrical(p1);            //標準的前序遍歷,先遍歷左子樹,再根結點,最後遍歷右子樹
        DefineSymmetrical(p2);         //自定義的對稱前序遍歷,先遍歷右子樹,再根結點,最後遍歷
        for(int i=0;i<vec1.size();i++) //左子樹注意一些特殊情況,比如所有的元素都是相同的,兩種
          {                            //遍歷結果可能是一樣的,事實上是非對陣的(比如奇數個相同
              if(vec1[i]!=vec2[i])     //的值明顯不是對陣的,但兩種遍歷結果相同),因此我們將所
                  return false;        //有的結點的左右結點為空時記為NULL。
          }
        return true;
    }

   void PreSymmetrical(TreeNode*p1)
     {
       if(p1==NULL)
           {
             vec1.push_back(0); 
             return;
           }
       vec1.push_back(p1->val);
       PreSymmetrical(p1->left);
       PreSymmetrical(p1->right);
     }
   void DefineSymmetrical(TreeNode*p2)
     {
       if(p2==NULL)
           {
             vec2.push_back(0); 
             return;
           }
       vec2.push_back(p2->val);
       DefineSymmetrical(p2->right);
       DefineSymmetrical(p2->left);
     }
private:
    vector<int> vec1,vec2;    //vec1和vec2分別用來儲存前序遍歷和自定義對稱前序遍歷的結果
};


相關推薦

offer 試題8:的下一個節點 c++

題目:給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。 解析:三種情況:1.若節點有右子樹,中序下一個就是 右子樹最左孩子節點  2.若無右子樹,且當前節點是父節點的左子節點,下一個就是父節點 &nb

offer{試題25:中和為某一值的路徑}

思路:這道題比較有意思,類似的題我在面試裡經常遇到過,圍繞著樹的深度遍歷和廣度遍歷做文章,針對這種型別的題,大家更多考慮的解決方案是遞迴,說白了二叉樹就是一群小二叉樹,上次做寶寶樹的筆試題的時候,出的演算法題就是求任意兩個節點之間的最遠距離,說白了還是遍歷的問題,回到這道題  &n

牛客網線上程式設計專題《offer-試題39》的深度

題目連結: 題目描述: 解題思路: 解法:遞迴的遍歷一棵數的左右子樹。 已經AC的程式碼: public class treeDepth39 { public class Tr

offer試題八:的下一個節點

題目描述: 給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。 思路 1.若該節點存在右子樹:則下一個節點為右子樹最左子節點(如圖節點 B ) 2. 若該節點不存在右子樹:這時分兩

offer試題7:重建(java實現)

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹,假設輸入的前序遍歷和中序遍歷的結果都不含重複的數字。例如:輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}則重建二叉樹:其中二叉樹的定義如下:  * publi

offer{試題19 :的映象}

public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {

Offer試題6 重建

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入的前序遍歷序列{1,2,4,7,3,5,6,8}和後序遍歷序列{4,7,2,1,5,3,8,6},則重建出如圖所示的二叉樹 二叉樹結點定義如下:

Offer 試題34:中和為某一值的路徑 Java程式碼實現

題目:輸入一棵二叉樹和整數,打印出二叉樹中節點值得和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。 解題思路:路徑從根節點開始,應該用類似於前序遍歷的方式訪問樹節點。

offer 試題:重建

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 思路:二叉樹先序是根左右,中序 是左根右。所以先找到

offer試題8:的下一個節點(Java 實現)

題目:給定一個二叉樹和其中的一個節點,如何找出中序遍歷序列的下一個節點?樹中的節點除了左右子節點外,還包含父節點。 思路: 節點分為有右子樹和沒有右子樹兩大類: 如果節點有右子樹,那麼它的下一個節點為它右子樹的最左節點 如果節點沒有右子樹,也可以分為兩類:(程

Offer試題:23.中和為某一值的路徑

一、題目:二叉樹中和為某一值的路徑 題目:輸入一棵二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。例如輸入下圖中二叉樹和整數22,則打印出兩條路徑,第一條路徑包含結點10、12,第二條路徑包含結點10、5和7。   二叉

offer——試題25:中和為某一值的路徑

void FindPath(BinaryTreeNode* pRoot, int expectedSum) { if(pRoot == NULL) return;

offer--試題19:的映象--Java實現

題目描述: 請完成一個函式,輸入一個二叉樹,該函式輸出它的映象。 解題思路: 我們先前序遍歷這棵樹的每個結點,如果這個結點有子結點,就交換它的兩個子結點。當交換完所有非葉子結點的左右子結點後,就得到了樹的映象。 這裡採用了遞迴方式和非遞迴方式。

offer試題:求的映象(遞迴、迴圈解法及測試用例)

題目:給定二叉樹,將其變換為源二叉樹的映象。 二叉樹的定義如下: struct TreeNode {     int val;     TreeNode* left;     TreeNode* right; }; 輸入描述: 二叉樹的映象定義:     源二叉樹    

offer試題59 對稱(java實現)

解題思路: 可以定義一種遍歷演算法,先訪問根節點,再遍歷右子樹後遍歷左子樹,可以將這種遍歷方法稱為對稱的前序遍歷。現在可以通過比較二叉樹的前序遍歷序列和對稱前序遍歷序列來判斷二叉樹是否對稱。如果兩個序

offer試題[59]-對稱

題目描述 請實現一個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。 /* struct TreeNode { int val;

offer{試題24:搜尋的後序遍歷序列}

這個題似曾相識,之前劍指offer有一道題是判斷該子樹是否是樹的一部分,有異曲同工之妙,看到這種題,上倆就應該想遞迴。 public class Solution { public boolean VerifySquenceOfBST(int [] sequence) {

Offer試題:22.搜尋的後序遍歷序列

一、題目:二叉搜尋樹的後序遍歷序列 題目:輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。   例如在下面的一顆二叉搜尋樹中,輸入陣列{5,7,6,9,11,10,8},則返回true,因為這個整數序列是

Offer試題:25.搜尋與雙向連結串列

一、題目:二叉搜尋樹與雙向連結串列 題目:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。比如輸入下圖中左邊的二叉搜尋樹,則輸出轉換之後的排序雙向連結串列。   二叉搜尋樹的節點定義如下,這裡使用C#語言描述:

offer-試題63:搜尋的第K個結點

題目:給定一棵二叉搜尋樹,請找出其中的第K大的結點。例如下圖中的二叉樹,按加點數值大小順序第三個結點的值是4。 思路:二叉搜尋樹的一個重要性質就是它的中序遍歷是排序的,因此這道題目只需要用中序遍歷演