劍指offer 57:對稱的二叉樹

題目描述

請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的。

鏡像比較(硬解)

思路:

  1. 判斷是否鏡像,可以先鏡像完一顆樹,然後一一比較樹和鏡像樹的值
  2. 第二種就是直接判斷左孩子的左孩子和右孩子的右孩子,左孩子的右孩子和右孩子的左孩子,對稱比較
/*
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. 利用棧的出入棧,成雙入隊,把左右孩子入棧然後出棧比較值,
  2. 然後再左孩子的左孩子和右孩子的右孩子,左孩子的右孩子和右孩子的左孩子這樣入棧,再重複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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章