剑指offer——28对称的二叉树

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
 
 
题解:
  使用正常前序遍历与反向的前序遍历进行比较结果即可,注意,需将空节点放入比较。
  方法一为使用额外空间进行存储比较,方法二为直接递归比较。
 
  
 1 class Solution01 {
 2 public:
 3     bool isSymmetrical(TreeNode* pRoot)
 4     {
 5         if (pRoot == nullptr)return true;
 6         vector<int>v1, v2;
 7         DFS(pRoot, v1, true);
 8         DFS(pRoot, v2, false);
 9         if (v1 == v2)return true;
10         else return false;
11         
12     }
13     void DFS(TreeNode* pRoot, vector<int>&v,const bool flag)
14     {
15         if (pRoot == nullptr)
16             v.push_back(-1);
17         else
18             v.push_back(pRoot->val);
19         if (pRoot == nullptr)return;
20         if (flag)
21         {
22             DFS(pRoot->left, v, flag);
23             DFS(pRoot->right, v, flag);
24         }
25         else
26         {
27             DFS(pRoot->right, v, flag);
28             DFS(pRoot->left, v, flag);
29         }
30     }
31 };
32 
33 class Solution02 {
34 public:
35     bool isSymmetrical(TreeNode* pRoot)
36     {
37         return DFS(pRoot, pRoot);
38 
39     }
40     bool DFS(TreeNode* root1, TreeNode* root2)
41     {
42         if (root1 == nullptr && root2 == nullptr)return true;
43         if (root1 == nullptr || root2 == nullptr)return false;
44         if (root1->val != root2->val)return false;
45         return DFS(root1->left, root2->right) && DFS(root1->right, root2->left);
46     }
47 };

 

你可能感兴趣的:(剑指offer——28对称的二叉树)