mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +08:00
Merge pull request #110 from Joshua-Lu/patch-27
更新 0101.对称二叉树 Java版本,递归与迭代
This commit is contained in:
@ -254,93 +254,108 @@ public:
|
|||||||
## 其他语言版本
|
## 其他语言版本
|
||||||
|
|
||||||
Java:
|
Java:
|
||||||
```java
|
|
||||||
public class N0101 {
|
|
||||||
/**
|
|
||||||
* 解法1:DFS,递归。
|
|
||||||
*/
|
|
||||||
public boolean isSymmetric2(TreeNode root) {
|
|
||||||
if (root == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
```Java
|
||||||
|
/**
|
||||||
|
* 递归法
|
||||||
|
*/
|
||||||
|
public boolean isSymmetric1(TreeNode root) {
|
||||||
return compare(root.left, root.right);
|
return compare(root.left, root.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean compare(TreeNode left, TreeNode right) {
|
private boolean compare(TreeNode left, TreeNode right) {
|
||||||
if (left == null && right == null) {
|
|
||||||
return true;
|
if (left == null && right != null) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
if (left != null && right == null) {
|
if (left != null && right == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (left == null && right != null) {
|
|
||||||
|
if (left == null && right == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (left.val != right.val) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// 比较外侧
|
||||||
if (left.val == right.val) {
|
boolean compareOutside = compare(left.left, right.right);
|
||||||
return compare(left.left, right.right) && compare(left.right, right.left);
|
// 比较内侧
|
||||||
}
|
boolean compareInside = compare(left.right, right.left);
|
||||||
|
return compareOutside && compareInside;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解法2:DFS,迭代
|
* 迭代法
|
||||||
|
* 使用双端队列,相当于两个栈
|
||||||
*/
|
*/
|
||||||
public boolean isSymmetric3(TreeNode root) {
|
public boolean isSymmetric2(TreeNode root) {
|
||||||
if (root == null) {
|
Deque<TreeNode> deque = new LinkedList<>();
|
||||||
return false;
|
deque.offerFirst(root.left);
|
||||||
}
|
deque.offerLast(root.right);
|
||||||
|
while (!deque.isEmpty()) {
|
||||||
if (!equal(root.left, root.right)) {
|
TreeNode leftNode = deque.pollFirst();
|
||||||
return false;
|
TreeNode rightNode = deque.pollLast();
|
||||||
}
|
if (leftNode == null && rightNode == null) {
|
||||||
|
continue;
|
||||||
Deque<TreeNode> st = new LinkedList<>();
|
}
|
||||||
|
// if (leftNode == null && rightNode != null) {
|
||||||
st.push(root.right);
|
// return false;
|
||||||
st.push(root.left);
|
// }
|
||||||
|
// if (leftNode != null && rightNode == null) {
|
||||||
TreeNode curR = root.right;
|
// return false;
|
||||||
TreeNode curL = root.left;
|
// }
|
||||||
|
// if (leftNode.val != rightNode.val) {
|
||||||
while (!st.isEmpty()) {
|
// return false;
|
||||||
curL = st.pop();
|
// }
|
||||||
curR = st.pop();
|
// 以上三个判断条件合并
|
||||||
|
if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) {
|
||||||
// 前序,处理
|
|
||||||
if (!equal(curL, curR)) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
deque.offerFirst(leftNode.left);
|
||||||
if (curR != null && curL != null) {
|
deque.offerFirst(leftNode.right);
|
||||||
st.push(curL.right);
|
deque.offerLast(rightNode.right);
|
||||||
st.push(curR.left);
|
deque.offerLast(rightNode.left);
|
||||||
st.push(curR.right);
|
|
||||||
st.push(curL.left);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean equal(TreeNode l, TreeNode r) {
|
/**
|
||||||
if (l == null && r == null) {
|
* 迭代法
|
||||||
return true;
|
* 使用普通队列
|
||||||
|
*/
|
||||||
|
public boolean isSymmetric3(TreeNode root) {
|
||||||
|
Queue<TreeNode> deque = new LinkedList<>();
|
||||||
|
deque.offer(root.left);
|
||||||
|
deque.offer(root.right);
|
||||||
|
while (!deque.isEmpty()) {
|
||||||
|
TreeNode leftNode = deque.poll();
|
||||||
|
TreeNode rightNode = deque.poll();
|
||||||
|
if (leftNode == null && rightNode == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// if (leftNode == null && rightNode != null) {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// if (leftNode != null && rightNode == null) {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// if (leftNode.val != rightNode.val) {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// 以上三个判断条件合并
|
||||||
|
if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// 这里顺序与使用Deque不同
|
||||||
|
deque.offer(leftNode.left);
|
||||||
|
deque.offer(rightNode.right);
|
||||||
|
deque.offer(leftNode.right);
|
||||||
|
deque.offer(rightNode.left);
|
||||||
}
|
}
|
||||||
if (l != null && r == null) {
|
return true;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (l == null && r != null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (l.val == r.val) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Python:
|
Python:
|
||||||
|
Reference in New Issue
Block a user