剑指:对称的二叉树

题目描述

请实现一个函数,用来判断一棵二叉树是不是对称的。

如果一棵二叉树和它的镜像一样,那么它是对称的。

样例

如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树:
    1
   /   2   2
 / \ / 3  4 4  3

如下图所示二叉树[1,2,2,null,4,4,3,null,null,null,null,null,null]不是对称二叉树:
    1
   /   2   2
   \ /    4 4  3

一、递归解法:

1.只要pRoot.left和pRoot.right是否对称即可

2.左右节点的值相等 且 对称子树left.left right.right ; left.rigth,right.left也对称

/*
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) && isSymmetrical(left.right, right.left);
    }
}

二、非递归DFS栈式计算

DFS使用stack来保存成对的节点

1.出栈的时候也是成对成对的 ,

1.若都为空,继续;

2.一个为空,返回false;

3.不为空,比较当前值,值不等,返回false;

2.确定入栈顺序,每次入栈都是成对成对的,如left.left, right.right ;left.rigth,right.left

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

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

    }

}
*/
import java.util.Stack;

public class Solution {
    boolean isSymmetrical(TreeNode pRoot)
    {
        if(pRoot == null){
            return true;
        }

        Stack<TreeNode> stack = new Stack<>();
        stack.push(pRoot.left);
        stack.push(pRoot.right);

        while(!stack.isEmpty()){
            TreeNode right = stack.pop();  //成对取出
            TreeNode left = stack.pop();

            if(right==null && left==null) continue;   //
            if(right==null || left==null) return false;
            if(right.val != left.val) return false;

            //成对插入
            stack.push(left.left);
            stack.push(right.right);
            stack.push(left.right);
            stack.push(right.left);
        }

        return true;
    }
}

三、非递归DFS栈式计算

1.出队的时候也是成对成对

1.若都为空,继续;

2.一个为空,返回false;

3.不为空,比较当前值,值不等,返回false;

2.确定入队顺序,每次入队都是成对成对的,如left.left, right.right ;left.rigth,right.left

boolean isSymmetricalBFS(TreeNode pRoot)
    {
        if(pRoot == null) return true;
        Queue<TreeNode> s = new LinkedList<>();
        s.offer(pRoot.left);
        s.offer(pRoot.right);
        while(!s.isEmpty()) {
            TreeNode left= s.poll();//成对取出
            TreeNode right= s.poll();
            if(left == null && right == null) continue;
            if(left == null || right == null) return false;
            if(left.val != right.val) return false;
            //成对插入
            s.offer(left.left);
            s.offer(right.right);
            s.offer(left.right);
            s.offer(right.left);
        }
        return true;
    }


原文地址:https://www.cnblogs.com/lisen10/p/11559364.html

时间: 2024-10-08 02:59:52

剑指:对称的二叉树的相关文章

剑指offer (19) 二叉树镜像 对称二叉树

题目: 输入一个二叉树,输出其镜像. BinTreeNode* ReverseTree(BinTreeNode* pRoot) { if (pRoot == NULL) return NULL; BinTreeNode* pLeftReverse = ReverseTree(pRoot->left); BinTreeNode* pRightReverse = ReverseTree(pRoot->right); pRoot->left = pRightReverse; pRoot->

【剑指offer】二叉树的镜像

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.C

剑指OFFER之二叉树的镜像(九度OJ1521)

题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩子,紧接着是右孩子的编号.C

剑指offer (39) 二叉树深度

题目:输入一棵二叉树的根节点,求该树的深度 题解分析: 二叉树具有天然的递归性,首先应该想递归解法 /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int maxDept

剑指Offer:二叉树打印成多行【23】

剑指Offer:二叉树打印成多行[23] 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 Java题解 package tree; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; public class PrintByLevel { public static void main(String[] args) { TreeNode t1 = n

剑指offer-37 序列化二叉树

剑指offer-37 序列化二叉树 题目: 思路: 自己解答: 这个有错误 public class Solution { String Serialize(TreeNode root) { if(root == null) return "#!"; StringBuilder bd = new StringBuilder(); serializeCore(root, bd); return bd.toString(); } private void serializeCore(Tre

剑指Offer--040-平衡二叉树(判断一棵二叉树是否是平衡二叉树)[扩展附加题]

链接 牛客OJ:平衡二叉树 九度OJ:未收录 GitHub代码: 040-平衡二叉树 CSDN题解:剑指Offer–040-平衡二叉树 牛客OJ 九度OJ CSDN题解 GitHub代码 040-平衡二叉树 未收录 剑指Offer–040-平衡二叉树 040-平衡二叉树 题意 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 递归法 根据平衡二叉树的定义 平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1 因此我们递归的判断每一个根节点,判断左右子树的高度差 递归得到二叉

[剑指offer] 重建二叉树,根据前中,输出后,根据中后,输出前

参考:<剑指offer>纪念版 情况1.:给出树的前序序列和中序序列,输出后序序列 情况2 :给出树的后序序列和中序序列,输出前序序列 解决方法:根据所给出的两个序列,构造出(重建)二叉树,然后按要求再遍历输出. 重建二叉树主要利用了递归的思想,最重要的是找出序列的范围(函数传参),这个要非常仔细,很容易出错.一定要在纸上画出图,然后根据图来确定范围. 用到的两个函数: 以情况1为例: 主要用到了两个函数: BinaryTreeNode* Construct(char* preorder, c

【Java】 剑指offer(7) 二叉树的下一个结点

本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. 思路 首先自己在草稿纸上画图,进行分析(不再展开).可以发现下一个结点的规律为: 1.若当前结点有右子树时,其下一个结点为右子树中最左子结点: 2.若当前结点无右子树时, (1)若当前结点为其父结点的左子结点时,其下一个结点为其父结点: (2)若当前结点为其父结点的右子结点时,继续向上遍

【Java】 剑指offer(34) 二叉树中和为某一值的路径

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 1.假设找到了其中一条路径,达到叶结点后,由于没有指向父结点的指针,所以必须提前创建一个链表存储前面经过的结点. 2.由于是从根结点出发,所以要想到使用前序遍历 3.利用链表存储结点,在该结点完成左右子树的路径搜索后(即递归函数结束,返回