文章優先發表在個人博客
http://www.xdx97.com/#/single?bid=97460bf1-014b-146e-55e3-179bdcc4fec2
胡扯:這個題,感覺挺好的。 這裏給出兩種思路,第二種思路是參考別人的思路寫出來的,但是,裏面的遞歸讓我弄了很久,也讓我對遞歸更加清楚了一些。事情慢慢變得有趣了 ...
思路一:
1、這個是我最先開始想到的思路代碼也還好。
2、除去根節點,左右開始遍歷。
3、左邊按照 左根右 的順序來遍歷,右邊按照 右根左 的順序來遍歷。葉子節點沒有節點。其它節點如果只有一個子節點,另外一個用 * 來代替,如果不這樣會有問題,可以思考一下。
4、這樣存儲起來的兩個字符串,對比如果相等。那麼就是對稱二叉樹了。
代碼一:
class Solution {
String left = "";
String right = "";
void leftDfs(TreeNode root){
if (root == null)
return;
left += root.val + "";
if(root.left != null)
leftDfs(root.left);
else if(root.right != null)
left += "*";
if(root.right != null)
leftDfs(root.right);
else if(root.left != null)
left += "*";
}
void RightDfs(TreeNode root){
if (root == null)
return;
right += root.val + "";
if(root.right != null)
RightDfs(root.right);
else if(root.left != null)
right += "*";
if(root.left != null)
RightDfs(root.left);
else if(root.right != null)
right += "*";
}
public boolean isSymmetric(TreeNode root) {
if (root == null || (root.right == null && root.left == null) )
return true;
leftDfs(root.left);
RightDfs(root.right);
// System.out.println(left);
// System.out.println(right);
return left.equals(right);
}
}
思路二:
1、這個思路是我提交成功後,看評論得出的思路。 【同時比較節點】
2、節點的遍歷順序也是, 左邊 左根右, 右邊 右根左。
3、如果相對位置不相同,那麼就不是對稱了。
4、這裏困擾我最大的一個問題就是,除了相同位置 值,不一樣不是對稱,還有一種情況就是高低不一樣的問題。其實這個如果想明白了就是很簡單,沒想明白就比較難了。
5、代碼也比較簡單,建議可以先按照這個思路寫一遍。
代碼二:
class Solution {
boolean flag = true;
void dfs(TreeNode l,TreeNode r){
if (l.val != r.val){
flag = false;
return;
}
if ( l.left == null && l.right == null && r.left == null && r.right == null )
return;
if (l.left != null && r.right != null)
dfs(l.left,r.right);
else if (l.left != null || r.right != null)
flag = false;
if (l.right != null && r.left != null)
dfs(l.right,r.left);
else if (l.right != null || r.left != null)
flag = false;
}
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
dfs(root,root);
return flag;
}
}