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.

提示:

  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

时间: 2024-08-04 17:46:12

LeetCode951-翻转等价二叉树的相关文章

lintcode:等价二叉树

等价二叉树 检查两棵二叉树是否等价.等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等. 样例 1 1 / \ / 2 2 and 2 2 / / 4 4 就是两棵等价的二叉树. 1 1 / \ / 2 3 and 2 3 / 4 4 就不是等价的. 解题 树的结构相同,结点值相等 直接递归 /** * Definition of TreeNode: * public class TreeNode { * public int val; * public Tr

等价二叉树

检查两棵二叉树是否等价.等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等. 样例 1 1 / \ / 2 2 and 2 2 / / 4 4 就是两棵等价的二叉树. 1 1 / \ / 2 3 and 2 3 / 4 4 就不是等价的. /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * publi

LintCode_469 等价二叉树

题目 检查两棵二叉树是否等价.等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等. 样例 1 1 / \ / 2 2 and 2 2 / / 4 4 就是两棵等价的二叉树. 1 1 / \ / 2 3 and 2 3 / 4 4 就不是等价的. C++代码 bool isIdentical(TreeNode* a, TreeNode* b) { // Write your code here if(!a && !b) { return true; } i

leetcode469:等价二叉树

1. 检查两棵二叉树是否等价.等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等. 1 1 / \ / 2 2 and 2 2 / / 4 4 就是两棵等价的二叉树. 1 1 / \ / 2 3 and 2 3 / 4 4 就不是等价的. 2.思路: 1.首先,判断跟,为空就返回true 2.其次,当不想等时.一方为空,一方不为空.或者两方的值不相等 3.再次递归本方法:先左后右 代码:递归 class TreeNode { public int val; p

Lintcode 469. 等价二叉树

----------------------------------------------- AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */

leetcode树专题894.897,919,951

满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点. 返回包含 N 个结点的所有可能满二叉树的列表. 答案的每个元素都是一个可能树的根结点. 答案中每个树的每个结点都必须有 node.val=0. 你可以按任何顺序返回树的最终列表. 示例: 输入:7 输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

[Swift Weekly Contest 118]LeetCode971.翻转二叉树以匹配先序遍历 | Flip Binary Tree To Match Preorder Traversal

Given a binary tree with N nodes, each node has a different value from {1, ..., N}. A node in this binary tree can be flipped by swapping the left child and the right child of that node. Consider the sequence of N values reported by a preorder traver

普通树与二叉树

树 树作为一种常用的数据结构,不可不知.树采用的是链式存储,在详细介绍树之前要先了解几个基本概念: 根.节点.孩子.双亲.兄弟.分支 就不多BB了,叶子指的是没有子节点的节点,树的高度指从根到树所有叶子节点的最大长度,节点的度为其子节点的数量,节点的深度为节点到根的路径长度. 二叉树 二叉表示至多两向选择,在许多场景下都有应用.二叉树的种类实在太多,今天先宽泛地说一下几种二叉树. 严格二叉树 严格二叉树是这样的二叉树,它的每个节点或者没有孩子或者有两个孩子,即没有一个孩子的节点. 满二叉树 满二