对称的二叉树-剑指Offer

对称的二叉树

题目描述

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

思路

  1. 先序遍历二叉树的顺序为“根->左->右”,我们定义个跟先序遍历对称的遍历顺序“跟->右->左”,如果这两个遍历的结点对应相等,则是对称二叉树
  2. 注意:因为叶子结点的左右子树在遍历结果中无法根据先后顺序区分,所以我们需要考虑到null指针,需要null指针对应也相等
  3. 如果二叉树为空,则也是对称的

代码

/*
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 symmetry(pRoot.left, pRoot.right);
    }
	boolean symmetry(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 symmetry(pRoot1.left, pRoot2.right) && symmetry(pRoot1.right, pRoot2.left);
	}
}
时间: 2024-10-09 12:22:34

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

从上往下打印二叉树-剑指Offer

从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路 数据结构:队列 将树按层遍历,先将根节点的左右子节点先后进入队列,然后再先后从队列取出,然后将取出的节点的左右子节点再入队列 循环进行,直到队列为空 代码 import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** public class TreeNode { int val = 0; Tree

序列化二叉树-剑指Offer

序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 思路 序列化就按先序遍历,遇到空指针也要存下来,递归调用,StringBuilder 反序列化是同样的递归调用,不过要考虑参数的传递,生成的TreeNode要返回 注意:对Sting[]的遍历,每次递归都要往后遍历一个字符,如果将这个位置信息point通过参数传入的话,就会造成函数无法正常遍历String[],此时,我们可以将位置信息设置为类的成员变量,每次递归时都要递增,这样既可满足条件 代码 /* public clas

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St

重建二叉树-剑指Offer

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路 先序遍历的第一个节点是中序遍历的根节点 从中序遍历中找先序遍历的那个根节点,然后切开左右子树,用递归函数分别构造左右子树 代码 public class Solution04 { // 重建二叉树 public TreeNode re

从上往下打印二叉树(剑指offer)+队列的应用

从上往下打印二叉树 参与人数:1577时间限制:1秒空间限制:32768K 通过比例:25.53% 最佳记录:0 ms|0K(来自  dust347) 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题意:就是树的层次遍历.想象一下,从根结点依次往下,每行从左到右,这不就是是入队和出队的操作嘛! so...代码很容易吧. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tr

4、重建二叉树------------>剑指offer系列

题目1-二叉树重建 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路 前序遍历:跟节点 + 左子树前序遍历 + 右子树前序遍历 中序遍历:左子树中序遍历 + 跟节点 + 右字数中序遍历 后序遍历:左子树后序遍历 + 右子树后序遍历 + 跟节点 根据上面的规律: 前序遍历找到根结点root 找到root在

重建二叉树——剑指Offer

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 解题思路 前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果. 牛客在线编程题 cyc2018解题思路 原文地址:https://www.cnblogs.com/yuyu

《剑指offer》题解

有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 剑指Offer - 九度1524 - 复杂链表的复制 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先 剑指Offer - 九度1508 - 把字符串转换成整数 剑指Offer - 九度1504 - 把数组排成最小的数 剑指Offer - 九度1503 - 二叉搜索树与双向链表 剑指Offer - 九度1390 - 矩形覆盖 剑

剑指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->