Description:
For a binary tree T, we can define a flip operation as follows: choose any node, and swap the left and right child subtrees.
A binary tree X is flip equivalent to a binary tree Y if and only if we can make X equal to Y after some number of flip operations.
Write a function that determines whether two binary trees are flip equivalent. The trees are given by root nodes root1 and root2.
Example 1:
Input: 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]
Output: true
Explanation: We flipped at nodes with values 1, 3, and 5.
Note:
Each tree will have at most 100 nodes.
Each value in each tree will be a unique integer in the range [0, 99].
Analysis:
Here we define a canonical form of a tree:
- If a node has only one son node, then the son node must be its left son.
- If a node has two son nodes, make sure the value of its left son node is lower than or equal to the value of its right son node.
1.Firstly, transform each tree to its canonical form, like the following image shows.
2.Secondly, do the pre-order traversal to each tree and then compare the results.(list1.equals(list2)
)
Code:
/**
* 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) {
if(root1 == null && root2 == null) {
return true;
}else if(root1 == null && root2 != null) {
return false;
}else if(root1 != null && root2 == null) {
return false;
}else{
List<Integer> tree1 = new ArrayList<>();
List<Integer> tree2 = new ArrayList<>();
buildCanonicalTree(root1, tree1);
buildCanonicalTree(root2, tree2);
return tree1.equals(tree2);
}
}
public void buildCanonicalTree(TreeNode node, List<Integer>tree) {
tree.add(node.val);
if(node.left != null && node.right != null) {
if(node.left.val > node.right.val) {
TreeNode temp = node.right;
node.right = node.left;
node.left = temp;
}
}else if(node.left == null && node.right != null) {
node.left = node.right;
node.right = null;
}
if(node.left != null) {
buildCanonicalTree(node.left, tree);
}
if(node.right != null) {
buildCanonicalTree(node.right, tree);
}
}
}