轉載請注明出處:http://blog.csdn.net/crazy1235/article/details/51541984
出處:https://leetcode.com/problems/symmetric-tree/
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1
/ \
2 2
/ \ / \
3 4 4 3
But the following is not:
1
/ \
2 2
\ \
3 3
判斷1顆2叉樹是不是 鏡像對稱。
判斷是不是是鏡像對稱,重要的就是判斷對應位置的兩個結點的值是不是相等。
方法1使用雙端隊列來實現。
/**
* 雙端隊列 <br />
* DFS <br />
* 3ms <br />
* beats 6.29% of java submissions
*
* @param root
* @return
*/
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
Deque<TreeNode> deque = new LinkedList<TreeNode>();
deque.addFirst(root.left);
deque.addLast(root.right);
TreeNode preNode = null;
TreeNode postNode = null;
while (!deque.isEmpty()) {
preNode = deque.pollFirst();
postNode = deque.pollLast();
if (preNode == null && postNode == null) {
continue;
}
if (preNode == null || postNode == null) {
return false;
}
if (preNode.val != postNode.val) {
return false;
} else {
deque.addFirst(preNode.right);
deque.addFirst(preNode.left);
deque.addLast(postNode.left);
deque.addLast(postNode.right);
}
}
return true;
}
每次都是從隊頭和隊尾各poll出結點,然落后行比較。
如果條件滿足,將隊頭結點的右結點和左結點入隊頭
將隊尾結點的左結點和右結點入隊尾
直到隊列為空
遞歸方式
/**
* 遞歸方式 <br />
* 1ms <br />
*
* @param root
* @return
*/
public boolean isSysmmetric2(TreeNode root) {
if (root == null) {
return true;
}
return checkNodes(root.left, root.right);
}
public boolean checkNodes(TreeNode node1, TreeNode node2) {
if (node1 == null && node2 == null) {
return true;
}
if (node1 == null || node2 == null) {
return false;
}
if (node1.val != node2.val) {
return false;
} else {
return checkNodes(node1.left, node2.right)
&& checkNodes(node1.right, node2.left);
}
}
該方法的效力較高~
1ms。
斟酌到之前有做過1個【Same Tree】 的題目和 【Reverse Binary Tree】 的題目。
所以想到,將當前2叉樹“反轉”,然后在判斷這兩個樹是不是1樣便可。
/**
* 拷貝1顆2叉樹,reverse。或拷貝的時候直接反轉。 <br />
* 然后在使用Same Tree的方法判斷這兩個樹是不是1樣。 <br />
* 1ms
*
* @param root
* @return
*/
public boolean isSysmmetric3(TreeNode root) {
if (root == null) {
return true;
}
TreeNode newRootNode = copyNode(root);
SameTree sameTree = new SameTree();
return sameTree.isSameTree(root, newRootNode);
}
/**
* 左右對換結點拷貝2叉樹
*
* @param node
* @return
*/
private TreeNode copyNode(TreeNode node) {
if (node == null) {
return null;
}
TreeNode treeNode = new TreeNode(node.val);
treeNode.left = copyNode(node.right);
treeNode.right = copyNode(node.left);
return treeNode;
}
傳送門
【Same Tree】
【Reverse Binary Tree】
bingo~~
上一篇 Java之IO操作總結