來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/symmetric-tree/
題目描述
給定一個二叉樹的根節(jié)點,檢查是否軸對稱。
題目分析
若一個樹的左右子樹鏡像對稱,那么這個二叉樹就是對稱的。
那么左右兩個樹什么情況下互為鏡像?
- 它們的兩個根結(jié)點具有相同的值
- 每個樹的右子樹都與另一個樹的左子樹鏡像對稱
因而,可考慮用遞歸實現(xiàn)。
代碼實現(xiàn)
public class DuiCheng101 {
/**
* 迭代算法
* 隊列中添加 對稱的兩個節(jié)點,判斷是否一致
*
* @param root
* @return
*/
public boolean isSymmetric2(TreeNode root) {
if (root == null) {
return true;
}
TreeNode left = root.left;
TreeNode right = root.right;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(left);
queue.offer(right);
while (!queue.isEmpty()) {
left = queue.poll();
right = queue.poll();
if (left == null && right == null) {
continue;
}
if (left == null || right == null) {
return false;
}
if (left.val != right.val) {
return false;
}
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
return true;
}
/**
* 【遞歸】
* 比較左右兩棵樹
*
* @param root
* @return
*/
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return check(root.left, root.right);
}
private boolean check(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null && q != null) {
return false;
}
if (p != null && q == null) {
return false;
}
if (p.val != q.val) {
return false;
}
return check(p.left, q.right) && check(p.right, q.left);
}
}
復(fù)雜度
- 時間復(fù)雜度:O(n),因為遍歷了整棵樹,因而漸進時間復(fù)雜度為O(n)
- 空間復(fù)雜度:遞歸層數(shù)不超過n,因而漸進空間復(fù)雜度為O(n)
好了,今天就到這里,感謝各位看官到這里,不如點個關(guān)注吧!