LeetCode951-翻转等价二叉树

问题:翻转等价二叉树

我们可以为二叉树 T 定义一个翻转操作,如下所示:选择任意节点,然后交换它的左子树和右子树。

只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转等价于二叉树 Y。

编写一个判断两个二叉树是否是翻转等价的函数。这些树由根节点 root1 和 root2 给出。

 

示例:

输入:root1 = [1,2,3,4,5,6,null,null,null,7,8], root2 = [1,3,2,null,6,4,5,null,null,null,null,8,7]
输出:true
解释:We flipped at nodes with values 1, 3, and 5.

Flipped Trees Diagram

 

提示:

  1. 每棵树最多有 100 个节点。
  2. 每棵树中的每个值都是唯一的、在 [0, 99] 范围内的整数。

 

链接:https://leetcode-cn.com/contest/weekly-contest-113/problems/flip-equivalent-binary-trees/

分析:

1.两个空指针相同

2.一个空一个非空,不相同

3.如果两个非空,值不等,不相同

4.两个非空且值相等,设为r1,r2,那么r1.left=r2.left 且r1.right=r2.right,或者r1.left=r2.right 且r1.right=r2.left,则相等,否则不等,递归即可。

 

AC Code:

 

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool flipEquiv(TreeNode* root1, TreeNode* root2) {
13         bool ret = false;
14         ret = check(root1, root2);
15         return ret;
16     }
17     bool check(TreeNode* root1, TreeNode* root2)
18     {
19         if (root1 == nullptr && root2 == nullptr)
20         {
21             return true;
22         }
23         if (root1 != nullptr && root2 != nullptr)
24         {
25             if (root1->val != root2->val)
26             {
27                 return false;
28             }
29             else
30             {
31                 
32                 return (check(root1->left, root2->left) && check(root1->right, root2->right))|| check(root1->left, root2->right) && check(root1->right, root2->left);
33 
34             }
35         }
36         else
37         {
38             return false;
39         }
40 
41         
42     }
43 };

 

其他:

1.第一code:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool flipEquiv(TreeNode* root1, TreeNode* root2) {
13         if (root1 == nullptr && root2 == nullptr)
14             return true;
15 
16         if (root1 == nullptr || root2 == nullptr)
17             return false;
18 
19         if (root1->val != root2->val)
20             return false;
21 
22         if (flipEquiv(root1->left, root2->left))
23             return flipEquiv(root1->right, root2->right);
24 
25         return flipEquiv(root1->left, root2->right) && flipEquiv(root1->right, root2->left);
26     }
27 };

2.虽然AC一次过了,不过测试的时候例子错了,所有的值使用前先判断是否为空,之前在这个上面栽过跟头,不过还是没记住,近期貌似也就周末参加个周赛了,手生了。

转载于:https://www.cnblogs.com/youdias/p/10052952.html

你可能感兴趣的:(数据结构与算法)