[LeetCode]對稱二叉樹
阿新 • • 發佈:2018-11-22
給定一個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:
1
/ \
2 2
\ \
3 3
說明:
如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。
思路有兩種:一種是DFS的思想,一種是BFS的思想
public boolean isSymmetric(TreeNode root) {
//這裡我判斷根節點為空和左右孩子為空作為特殊情況
if (root == null || root.left == null && root.right == null) {
return true;
}
//雙向佇列
LinkedList<TreeNode> queue = new LinkedList<>();
//新增根節點
queue.addLast(root);
//每次while迴圈開始時,儲存佇列的總數,方便後面的for迴圈
int count;
//判斷是不是根節點,我把根節點作為特殊情況處理,因為後面的for迴圈中倘若count為1,
//則不會執行for迴圈裡面的語句,當然各位也可以自己改進改進
boolean head = true;
//判斷佇列是否為空
while (!queue.isEmpty()) {
//儲存迴圈開始時,佇列的裡面資料的總數
count = queue.size();
//記錄當前一行每個節點的資料
TreeNode[] nodes = new TreeNode[count];
//記錄當前一行所有資料的值,若為空則存為Integer的最小值
int[] val = new int[count];
for (int i = 0; i < count; i++) {
//其中pollFirst獲取頭部元素並刪除,如果頭部元素為null則不會拋異常
nodes[i] = queue.pollFirst();
if (nodes[i] == null) {
val[i] = Integer.MIN_VALUE;
continue;
}
val[i] = nodes[i].val;
}
//類似於迴文的樣子,進行一一的比較
for (int i = 0; i < count / 2; i++) {
if (val[i] != val[count - 1 - i]) {
return false;
}
}
//判斷為根節點,若為則新增根節點的左右子樹
if (head) {
queue.addFirst(nodes[0].left);
queue.addLast(nodes[0].right);
head = false;
continue;
}
//for迴圈,判斷當前行的每個樹的左右子樹與其對稱的另一個左右子樹是否不為空,都為空則不新增進佇列,
//一邊樹為空,另一邊不為空則直接返回false表示已經不對稱了
for (int i = 0; i < count / 2; i++) {
if (nodes[i].left == null && nodes[count - 1 - i].right != null) {
return false;
} else if (nodes[i].left != null && nodes[count - 1 - i].right == null) {
return false;
} else if (nodes[i].right == null && nodes[count - 1 - i].left != null) {
return false;
} else if (nodes[i].right != null && nodes[count - 1 - i].left == null) {
return false;
}
if (nodes[i].left != null && nodes[count - 1 - i].right != null) {
queue.addFirst(nodes[i].left);
queue.addLast(nodes[count - 1 - i].right);
}
if (nodes[i].right != null && nodes[count - 1 - i].left != null) {
queue.addFirst(nodes[i].right);
queue.addLast(nodes[count - 1 - i].left);
}
}
}
return true;
}