【Leetcode】101. Symmetric Tree

本文介绍三种方法判断二叉树是否对称:递归、栈操作及队列操作。递归法通过比较左右子树来判断;栈操作法使用两个栈分别存放左右子树节点;队列操作法则利用两个队列实现。

方法一:递归:

思路:

(1)若树为空,直接返回true。否则调用判断左右子树是否对称的函数isSymmetricTree(root.left, root.right)。

(2)判断左右子树是否对称:若左右子树均为空,直接返回true;否则若左右子树有一棵树为空,直接返回false;否则判断左右子树的根节点的值是否相等,再判断左子树的右子树与右子树的左子树是否对称以及左子树的左子树与右子树的右子树是否对称。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null)
            return true;
        return isSymmetricTree(root.left, root.right);
    }  
    public boolean isSymmetricTree(TreeNode left, TreeNode right) {
        if (left == null && right == null)
            return true;
        else if (left == null || right == null)
            return false;
        else
            return left.val == right.val && isSymmetricTree(left.right, right.left) && isSymmetricTree(left.left, right.right);
    }
}
Rumtime:1ms

方法二:栈操作

思路:

(1)若树为空,直接返回true。

(2)先把根节点的左孩子放入栈stack1,再把根节点的右孩子放入栈stack2

(3)只要栈stack1不为空,就弹出两个栈的栈顶节点,若两个节点都为空,则继续循环;若一个节点为空而另一个节点不为空或两个节点的值不相等,则返回false。再把左子树的左子节点、右子节点和右子树的子节点、左边子节点依次压入栈。

(4)栈为空时,返回true。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
       if (root == null)  
            return true;  
        Stack<TreeNode> stack1 = new Stack<TreeNode>();
        Stack<TreeNode> stack2 = new Stack<TreeNode>();
        stack1.push(root.left);  
        stack2.push(root.right);  
        while (!stack1.isEmpty() ) {  
            TreeNode p = stack1.pop();  
            TreeNode q = stack2.pop();  
            if (p == null && q == null) 
                continue;
            if (p == null || q == null || p.val != q.val)  
                return false;
            stack1.push(p.left);  
            stack1.push(p.right);  
            stack2.push(q.right);  
            stack2.push(q.left);  
        }
        return true; 
    }
}
Rumtime:3ms


方法三:队列操作

思路:

(1)若树为空,直接返回true。

(2)先把根节点的左孩子放入队列queue1,再把根节点的右孩子放入队列queue2。

(3)只要队列queue1不为空,就弹出两个队列的头节点,若两个节点都为空,则继续循环;若一个节点为空而另一个节点不为空或两个节点的值不相等,则返回false。再把左子树的左子节点、右子节点和右子树的右子节点、左边子节点依次压入队列

(4)队列为空时,返回true。


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null)  
            return true;  
        Queue<TreeNode> queue1=new LinkedList<TreeNode>();  
        Queue<TreeNode> queue2=new LinkedList<TreeNode>();  
        queue1.add(root.left);  
        queue2.add(root.right);  
        while (!queue1.isEmpty() ) {  
            TreeNode p = queue1.poll();  
            TreeNode q = queue2.poll();  
            if (p == null && q == null) 
                continue;  
            if (p == null || q == null || p.val != q.val)  
                return false;
            queue1.add(p.left);  
            queue1.add(p.right);  
            queue2.add(q.right);  
            queue2.add(q.left);  
        }
        return true; 
    }
}
Rumtime:2ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值