剑指offer-58. 对称的二叉树

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

递归解题思路:

1、按照先遍历左结点,再遍历右节点的顺序遍历该二叉树
2、按照先遍历右结点,再遍历左结点的顺序遍历该二叉树
3、如果两次结果相同,则是对称二叉树,否则,不是对称二叉树

代码实现:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot)
    {
        /*
        解题思路:
        1、按照先遍历左结点,再遍历右节点的顺序遍历该二叉树
        2、按照先遍历右结点,再遍历左结点的顺序遍历该二叉树
        3、如果两次结果相同,则是对称二叉树,否则,不是对称二叉树
        */
       return isSymmetry(pRoot,pRoot);
    }
    
    bool isSymmetry(TreeNode* pRoot1,TreeNode* pRoot2){
        if(pRoot1 ==NULL && pRoot2 == NULL){
            return true;
        }
        if(pRoot1 == NULL || pRoot2 == NULL){
            return false;
        }
        if(pRoot1->val != pRoot2->val){
            return false;
        }
        return isSymmetry(pRoot1->left,pRoot2->right)&&isSymmetry(pRoot1->right,pRoot2->left);
    }
    

};

 效率:

非递归解题思路:

1、设置两个队列,分别代表左子树和右子树;
2、一个队列从左往右添加结点,一个队列从右往左添加结点
3、出队后判断两个队列的出队元素的值是否相同
4、直到遍历完整棵树,队列为空。否则不是对称二叉树

代码实现:

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
    boolean isSymmetrical(TreeNode pRoot)
    {
        /*
        解题思路:
        1、设置两个队列,分别代表左子树和右子树;
        2、一个队列从左往右添加结点,一个队列从右往左添加结点
        3、出队后判断两个队列的出队元素的值是否相同
        4、直到遍历完整棵树,队列为空。否则不是对称二叉树
        */
        if(pRoot == null){
            return true;
        }
        Queue<TreeNode> leftQueue = new LinkedList<TreeNode>();
        Queue<TreeNode> rightQueue = new LinkedList<TreeNode>();
        leftQueue.offer(pRoot.left);
        rightQueue.offer(pRoot.right);
        while(leftQueue.size()!=0 && rightQueue.size()!=0){
           TreeNode leftNode = leftQueue.poll();
           TreeNode rightNode = rightQueue.poll();
           if(leftNode==null && rightNode==null){
               continue;
           }
           if(leftNode==null || rightNode==null){
               return false;
           }
           if(leftNode.val != rightNode.val){
               return false;
           }
           leftQueue.offer(leftNode.left);
           leftQueue.offer(leftNode.right);
           
           rightQueue.offer(rightNode.right);
           rightQueue.offer(rightNode.left);
           
        }
        return leftQueue.size()==0 && rightQueue.size()==0;
        
        
    }
}

 效率:

 
发布了89 篇原创文章 · 获赞 0 · 访问量 934

猜你喜欢

转载自blog.csdn.net/qq_34449717/article/details/103897042