題目描述
請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的。
鏡像比較(硬解)
思路:
- 判斷是否鏡像,可以先鏡像完一顆樹,然後一一比較樹和鏡像樹的值
- 第二種就是直接判斷左孩子的左孩子和右孩子的右孩子,左孩子的右孩子和右孩子的左孩子,對稱比較
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot == null) return true;
return isSymmetrical(pRoot.left, pRoot.right);
}
private boolean isSymmetrical(TreeNode left, TreeNode right) {
if(left == null && right == null) return true;
if(left == null || right == null) return false;
return left.val == right.val //爲鏡像的條件:左右節點值相等
&& isSymmetrical(left.left, right.right) //2.對稱的子樹也是鏡像
&& isSymmetrical(left.right, right.left);
}
}
棧成雙入隊法(軟解)
思路:
- 利用棧的出入棧,成雙入隊,把左右孩子入棧然後出棧比較值,
- 然後再左孩子的左孩子和右孩子的右孩子,左孩子的右孩子和右孩子的左孩子這樣入棧,再重複1的步驟判斷
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot == null) return true;
Stack<TreeNode> s = new Stack<TreeNode>();
s.push(pRoot.left);
s.push(pRoot.right);
while(!s.empty()) {
TreeNode right = s.pop();//成對取出
TreeNode left = s.pop();
if(left == null && right == null) continue;
if(left == null || right == null) return false;
if(left.val != right.val) return false;
//成對插入
s.push(left.left);
s.push(right.right);
s.push(left.right);
s.push(right.left);
}
return true;
}
}