對稱二叉樹 【leetcode - 101 - 簡單】

文章優先發表在個人博客

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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章