算法(三) 對稱二叉樹 用來判斷一顆二叉樹是不是對稱的

請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的在這裏插入圖片描述

/ *
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

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