我试图解决Leetcode中的this问题。
问题如下:
对于二叉树T,我们可以如下定义翻转操作: 任何节点,并交换左右子树。
当且仅当二叉树X翻转等效于二叉树Y 经过几次翻转操作,我们可以使X等于Y。
编写一个确定两个二叉树是否翻转的函数 当量。这些树由根节点root1和root2给出。
您可以参考链接中的示例。
因此,对于这个问题,我尝试了以下方法。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean flipEquiv(TreeNode root1, TreeNode root2) {
Queue<TreeNode> q1 = new LinkedList<>();
Queue<TreeNode> q2 = new LinkedList<>();
Map<TreeNode,TreeNode> a1 = new HashMap<>();
Map<TreeNode,TreeNode> a2 = new HashMap<>();
if(root1!=null){
q1.add(root1);
a1.put(root1,null);
}
if(root2!=null){
q2.add(root2);
a2.put(root2,null);
}
while(!q1.isEmpty() && !q2.isEmpty()){
TreeNode node1 = q1.poll();
TreeNode node2 = q2.poll();
// System.out.println(node1.val +" "+node2.val+" ");
if(node1.val!=node2.val){
return false;
}
if(a1.get(node1)==null){
if(a2.get(node2)!=null){
return false;
}
}else{
if(a2.get(node2)==null){
return false;
}
// System.out.println(node1.val +" "+node2.val+" "+a1.get(node1).val+" "+a2.get(node2).val+" "+node1+" "+node2);
if(a1.get(node1).val!=a2.get(node2).val){
return false;
}
}
// System.out.println(node1+" "+node2);
if(node1.left==null && node2.left==null){
if(node1.right==null && node2.right!=null){
return false;
}else if(node1.right!=null && node2.right==null){
return false;
}else if(node1.right!=null && node2.right!=null){
if(node1.right.val!=node2.right.val){
return false;
}else{
q1.add(node1.right);
a1.put(node1.right,node1);
q2.add(node2.right);
a2.put(node2.right,node2);
}
}
}else if(node1.left==null && node2.left!=null){
if(node1.right==null){
return false;
}
if(node2.right!=null){
return false;
}
if(node1.right.val!=node2.left.val){
return false;
}else{
q1.add(node1.right);
a1.put(node1.right,node1);
q2.add(node2.left);
a2.put(node2.left,node2);
}
}else if(node1.left!=null && node2.left==null){
if(node1.right!=null){
return false;
}
if(node2.right==null){
return false;
}
if(node1.left.val!=node2.right.val){
return false;
}else{
q1.add(node1.left);
a1.put(node1.left,node1);
q2.add(node2.right);
a2.put(node2.right,node2);
}
}else{
if(node1.left.val!=node2.left.val){
if(node2.right==null){
return false;
}
if(node1.right==null){
return false;
}
if(node1.left.val!=node2.right.val){
return false;
}else{
q1.add(node1.left);
a1.put(node1.left,node1);
q2.add(node2.right);
a2.put(node2.right,node2);
}
if(node1.right.val!=node2.left.val){
return false;
}else{
q1.add(node1.right);
a1.put(node1.right,node1);
q2.add(node2.left);
a2.put(node2.left,node2);
}
}else{
if(node1.right==null && node2.right!=null){
return false;
}else if(node1.right!=null && node2.right==null){
return false;
}else if(node1.right!=null && node2.right!=null){
if(node1.right.val!=node2.right.val){
return false;
}else{
// System.out.println(node1+" "+node2);
q1.add(node1.left);
a1.put(node1.left,node1);
q2.add(node2.left);
a2.put(node2.left,node2);
q1.add(node1.right);
a1.put(node1.right,node1);
q2.add(node2.right);
a2.put(node2.right,node2);
}
}
}
}
}
//System.out.println()
if(q1.isEmpty() && q2.isEmpty()){
return true;
}
return false;
}
}
因此,当我提交此解决方案时,我通过了71/72个测试用例,但一次失败。我无法弄清楚我的代码出了什么问题。
失败的测试用例如下:
这是级别顺序中的二叉树的表示。
[0,1,2,3,8,9,4,33,14,18,null,11,10,5,6,94,72,16,54,30,21,27,53, 17,13,25,null,7,12,null,null,null,73,26,19,null,null,null,null,24,37,28,59,null,56,20,null,97, 36,null,62,49,40,15,null,null,null,null,74,34,null,52,32,39,null,29,null,67,87,null,null,22,null, null,null,66,41,null,null,null,85,47,42,35,50,null,null,null,null,null,null,38,55,null,76,58,null,null, null,null,null,31,23,null,null,null,43,92,null,null,null,84,null,95,null,96,null,64,45,null,57,null,null, 61,null,46,60,null,69,93,44,null,null,null,null,99,null,null,null,null,null,48,51,68,83,null,null,65, 81,null,null,null,88,null,null,null,null,null,null,70,63,null,null,null,71,null,null,75,null,null,null,91,null, null,null,79,77,78,98,null,90,null,null,null,null,80,82,null,86,null,null,null,null,null,null,89]
[0,2,1,4,9,8,3,6,5,11,10,18,null,33,14,7,12,null,25,27,53,13,17, 30,21,72,94,16,54,40,49,15,null,62,null,59,28,null,56,36,97,20,null,null,null,37,24,73, null,null,null,26,19,null,null,47,42,null,85,35,50,null,null,67,87,29,null,null,null,41,66,null,null, 22,null,39,null,32,52,null,null,74,null,null,34,null,null,null,84,92,null,95,null,null,96,null,null,null, null,58,null,null,43,null,null,23,31,null,76,55,38,null,null,null,null,null,null,null,null,null,null,null,99, null,null,61,null,44,93,69,null,60,46,null,null,null,57,64,45,null,null,null,null,null,null,null,null,null, 88,null,null,65,81,83,68,null,null,48,51,91,null,75,null,null,null,98,null,null,71,63,70,null,null, null,null,null,90,null,null,null,78,77,79,null,null,null,null,null,86,80,82,null,null,null,null,null,null,null, 89]
此例的预期输出为false
,但我返回的是true
如果有人可以指出我在哪里以及为什么我在这方面出错的话,那将是很棒的事情。
答案 0 :(得分:1)
我不确定您为什么要通过思考级别顺序遍历来解决问题。它很难从代码中读取,但是实际上这个问题很容易解决。您不需要水平订单遍历。
有两个条件:
这种情况很简单,立即返回false,因为翻转左,右子树没有意义。
根的值相等:
在这种情况下,您可以先检查而不翻转: 如果根的左子树和右子树与第二根的相应左子树和右子树相等,则不需要任何翻转,只需返回true。
如果它们不相等,请尝试翻转,即您需要检查
第一个根的左子树==第二个根的右子树&
第一个根的右子树==第二个根的左子树
您真的不需要翻转元素,只需检查相等性即可。
代码:
public boolean flipEquiv(TreeNode root1, TreeNode root2) {
if ( root1 == null && root2 != null ) return false;
if ( root2 == null && root1 != null ) return false;
if ( root1 == null && root2 == null ) return true;
if ( root1.val != root2.val ) return false;
boolean isLeftEqual = flipEquiv(root1.left, root2.left);
boolean isRightEqual = flipEquiv(root1.right, root2.right);
if ( !isLeftEqual || !isRightEqual ) {
isLeftEqual = flipEquiv(root1.left, root2.right);
isRightEqual = flipEquiv(root1.right, root2.left);
}
return isLeftEqual && isRightEqual;
}
答案 1 :(得分:-1)
尝试一下:(您都没有检查是否同时离开)
class Solution {
public boolean flipEquiv(TreeNode root1, TreeNode root2) {
Queue<TreeNode> q1 = new LinkedList<>();
Queue<TreeNode> q2 = new LinkedList<>();
Map<TreeNode,TreeNode> a1 = new HashMap<>();
Map<TreeNode,TreeNode> a2 = new HashMap<>();
if(root1!=null){
q1.add(root1);
a1.put(root1,null);
}
if(root2!=null){
q2.add(root2);
a2.put(root2,null);
}
while(!q1.isEmpty() && !q2.isEmpty()){
TreeNode node1 = q1.poll();
TreeNode node2 = q2.poll();
//System.out.println(node1.val +" "+node2.val+" ");
if(node1.val!=node2.val){
return false;
}
if(a1.get(node1)==null){
if(a2.get(node2)!=null){
return false;
}
}else{
if(a2.get(node2)==null){
return false;
}
// System.out.println(node1.val +" "+node2.val+" "+a1.get(node1).val+" "+a2.get(node2).val+" "+node1+" "+node2);
if(a1.get(node1).val!=a2.get(node2).val){
return false;
}
}
//System.out.println(node1+" "+node2);
//1 right 2 right
if(node1.left==null && node2.left==null){
if(node1.right==null && node2.right!=null){
return false;
}else if(node1.right!=null && node2.right==null){
return false;
}else if(node1.right!=null && node2.right!=null){
if(node1.right.val!=node2.right.val){
return false;
}else{
q1.add(node1.right);
a1.put(node1.right,node1);
q2.add(node2.right);
a2.put(node2.right,node2);
}
}
}
//add this
//1 left 2 left
else if(node1.right==null && node2.right==null){
if(node1.left==null && node2.left!=null){
return false;
}else if(node1.left!=null && node2.left==null){
return false;
}else if(node1.left!=null && node2.left!=null){
if(node1.left.val!=node2.left.val){
return false;
}else{
q1.add(node1.left);
a1.put(node1.left,node1);
q2.add(node2.left);
a2.put(node2.left,node2);
}
}
}
//1 right 2 left
else if(node1.left==null && node2.left!=null){
if(node1.right==null){
return false;
}
if(node2.right!=null){
return false;
}
if(node1.right.val!=node2.left.val){
return false;
}else{
q1.add(node1.right);
a1.put(node1.right,node1);
q2.add(node2.left);
a2.put(node2.left,node2);
}
}
//1 left 2 right
else if(node1.left!=null && node2.left==null){
if(node1.right!=null){
return false;
}
if(node2.right==null){
return false;
}
if(node1.left.val!=node2.right.val){
return false;
}else{
q1.add(node1.left);
a1.put(node1.left,node1);
q2.add(node2.right);
a2.put(node2.right,node2);
}
}else{
// 1 left right 2 left right
if(node1.left.val!=node2.left.val){
if(node2.right==null){
return false;
}
if(node1.right==null){
return false;
}
if(node1.left.val!=node2.right.val){
return false;
}else{
q1.add(node1.left);
a1.put(node1.left,node1);
q2.add(node2.right);
a2.put(node2.right,node2);
}
if(node1.right.val!=node2.left.val){
return false;
}else{
q1.add(node1.right);
a1.put(node1.right,node1);
q2.add(node2.left);
a2.put(node2.left,node2);
}
}else{
if(node1.right==null && node2.right!=null){
return false;
}else if(node1.right!=null && node2.right==null){
return false;
}else if(node1.right!=null && node2.right!=null){
if(node1.right.val!=node2.right.val){
return false;
}else{
q1.add(node1.left);
a1.put(node1.left,node1);
q2.add(node2.left);
a2.put(node2.left,node2);
q1.add(node1.right);
a1.put(node1.right,node1);
q2.add(node2.right);
a2.put(node2.right,node2);
}
}
}
}
}
System.out.println(a1.size());
if(q1.isEmpty() && q2.isEmpty()){
return true;
}
return false;
}
}
(当两个节点都刚刚离开节点时您会想念它,因此您不会在所有树上旅行)