請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的
/ *
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 comRoot(pRoot.left, pRoot.right);
}
private boolean comRoot(TreeNode left, TreeNode right) {
// TODO Auto-generated method stub
if(left == null) return right==null;
if(right == null) return false;
if(left.val != right.val) return false;
return comRoot(left.right, right.left) && comRoot(left.left, right.right);
}
}
分析:
這個算法妙的地方在於遞歸的時候 comRoot(left.right, right.left) && comRoot(left.left, right.right); 選擇的是左節點的右子節點和右節點的左子節點進行比較等,這樣交叉的比較不僅可以確定是不是對稱的,而且可以有另一種方法遍歷所有的節點,是一種除了左中右,中左右,又中左之外的交叉遍歷的方法。
參考自:
1、https://www.nowcoder.com/questionTerminal/ff05d44dfdb04e1d83bdbdab320efbcb
2、https://blog.csdn.net/ustcer_93lk/article/details/80373736