原題
檢查兩棵二叉樹是否在通過若干次扭轉後能夠等價。扭轉的定義是,交換任意節點的左右子樹。等價的定義是,兩棵二叉樹必須爲相同的結構,而且對應位置上的節點的值要相等。
注意:你能夠假設二叉樹中不會有重複的節點值。
樣例ide
1 1
/ / \
2 3 and 3 2
/ \
4 4
是扭轉後可等價的二叉樹。code
1 1
/ / \
2 3 and 3 2
/ /
4 4
就不是扭轉後能夠等價的二叉樹。遞歸
解題思路
Recursion - 遞歸求解,分治的思路。
注意,題目中說的是通過若干次扭轉後能夠等價,因此不要忘記考慮徹底identical的狀況,某一個節點的左右子樹翻轉一次對稱,反轉兩次還原。get
文/Jason_Yuan(簡書做者)
原文連接:http://www.jianshu.com/p/0623...io
public boolean isTweakedIdentical(TreeNode a, TreeNode b) { if (a == null && b == null) { return true; } if (a == null || b == null) { return false; } if (a.val != b.val){ return false; } //divide // boolean left = isTweakedIdentical(a.left, b.right); // boolean right = isTweakedIdentical(a.right, b.left); //注意,題目中說的是通過若干次扭轉後能夠等價,因此不要忘記考慮徹底identical的狀況,某一個節點的左右子樹翻轉一次對稱,反轉兩次還原。 boolean left = isTweakedIdentical(a.left, b.left) || isTweakedIdentical(a.left, b.right); boolean right = isTweakedIdentical(a.right, b.right) || isTweakedIdentical(a.right, b.left); //conquer // if (left != true || right != true){ // return false; // } // else{ // return true; // } return left && right; }