1. 程式人生 > 其它 >LeetCode101.對稱二叉樹(遞迴和迭代法)

LeetCode101.對稱二叉樹(遞迴和迭代法)

技術標籤:LeetCodeleetcode二叉樹

給定一個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
在這裡插入圖片描述
但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:
在這裡插入圖片描述

解法一:遞迴方法(java)

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }
        return compare(root.left, root.
right); } public boolean compare(TreeNode node1, TreeNode node2) { // 處理空節點 if (node1 == null && node2 != null) { return false; } else if (node1 != null && node2 == null) { return false; } else if (node1 == null &&
node2 == null) { return true; // 處理節點值不相同的情況 } else if (node1.val != node2.val) { return false; } // 遞迴判斷左右子樹 boolean outside = compare(node1.left, node2.right); boolean inside = compare(node1.right, node2.left); return
outside && inside; } }

解法二:迭代方法(java)

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }
        // 使用棧來儲存比較順序
        Deque<TreeNode> stack = new LinkedList<>();
        stack.push(root.left);
        stack.push(root.right);

        while (!stack.isEmpty()) {
            TreeNode node1 = stack.pop();
            TreeNode node2 = stack.pop();

            if (node1 == null && node2 != null){
                return false;
            } else if (node1 != null && node2 == null) {
                return false;
            } else if (node1 == null && node2 == null) {
                continue;
            } else if (node1.val != node2.val) {
                return false;
            }
			// 注意加入棧的順序
            stack.push(node1.left);
            stack.push(node2.right);
            stack.push(node1.right);
            stack.push(node2.left);

        }
        return true;
    }
}