LeetCode101.對稱二叉樹(遞迴和迭代法)
阿新 • • 發佈:2021-02-10
給定一個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:
解法一:遞迴方法(java)
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return compare(root.left, root. right);
}
public boolean compare(TreeNode node1, TreeNode node2) {
// 處理空節點
if (node1 == null && node2 != null) {
return false;
} else if (node1 != null && node2 == null) {
return false;
} else if (node1 == null && node2 == null) {
return true;
// 處理節點值不相同的情況
} else if (node1.val != node2.val) {
return false;
}
// 遞迴判斷左右子樹
boolean outside = compare(node1.left, node2.right);
boolean inside = compare(node1.right, node2.left);
return outside && inside;
}
}
解法二:迭代方法(java)
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
// 使用棧來儲存比較順序
Deque<TreeNode> stack = new LinkedList<>();
stack.push(root.left);
stack.push(root.right);
while (!stack.isEmpty()) {
TreeNode node1 = stack.pop();
TreeNode node2 = stack.pop();
if (node1 == null && node2 != null){
return false;
} else if (node1 != null && node2 == null) {
return false;
} else if (node1 == null && node2 == null) {
continue;
} else if (node1.val != node2.val) {
return false;
}
// 注意加入棧的順序
stack.push(node1.left);
stack.push(node2.right);
stack.push(node1.right);
stack.push(node2.left);
}
return true;
}
}