剑指offer(58)对称的二叉树

题目描述

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

题目分析

主要是要懂得如何去判断对称,比如描述一颗树我们可以通过两个序列就能得到这棵树的性质。因此我们可以这样想

对称就是左边和右边对称,那么我可以通过描述一种新的遍历序列,比如前序序列(LVR)的新的,就是对称前序遍历(LRV)。

通过前序遍历序列和对称前序遍历这两种,我们就能确定一颗树的性质,也就是确定这棵树是否是对称二叉树。

递归肯定是要用的,此外需要注意的一点就是需要把null的情况也考虑到,来排除缺失节点的情况造成的影响。

代码

function isSymmetrical(pRoot)
{
    if(pRoot == null){
        return true;
    }
    return compareRoot(pRoot.left, pRoot.right);
}
function compareRoot(left, right){
    if(left == null){
        return right == null;
    }
    if(right == null){
        return false;
    }
    if(left.val != right.val){
        return false;
    }
    return compareRoot(left.left, right.right)
        && compareRoot(left.right, right.left);
}

原文地址:https://www.cnblogs.com/wuguanglin/p/isSymmetrical.html

时间: 2024-10-08 08:47:04

剑指offer(58)对称的二叉树的相关文章

剑指offer 58.对称的二叉树

58.对称的二叉树 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solution { 1

剑指Offer:对称的二叉树【28】

剑指Offer:对称的二叉树[28] 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 Java题解 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution {

剑指offer:对称的二叉树

题目描述请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def isSymmetrical(self, pRoot): """ 判断一颗二叉树是否是对称的,可以通过对比两次先序遍历的结果.第一次先按照正常的先序

剑指Offer对答如流系列 - 序列化二叉树

面试题37:序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 树的结构定义如下: public class Node { int val = 0; Node left = null; Node right = null; public Node(int val) { this.val = val; } } 问题分析 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,具体的内容我们之前探讨过 剑指Offer对答如流系列 - 重建二叉树 但是采用这种方式进行序列化

【剑指offer】十七,二叉树中和为某一值的路径

题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 分析:队树的节点值得求和之类的操作大部分都是基于树的遍历操作的,只要对树的遍历操作稍作变形,基本都能解决问题(个人观点).我们知道只有树的先序遍历是首先访问根节点的,此题的关键在于如何把树遍历过程中的节点保存下来,把满足条件的路径加入到结果中,不满足条件的路径节点如何进行重新的搜索.当用前序遍历的方式访问到某一节点时,我们把该节点添加到路径上,并

剑指offer系列32-----对称二叉树的判断

[题目]请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 1 package com.exe7.offer; 2 3 /** 4 * [题目]请实现一个函数,用来判断一颗二叉树是不是对称的. 5 * 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 6 * @author WGS 7 * 8 */ 9 public class SymmetricalTreeNode { 10 public class TreeNode{

剑指offer系列源码-二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. #include <iostream> #include<stdio.h> #include<vector> using namespace std; struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; }; //递归判断路劲

剑指offer系列源码-二叉树的镜像

输入一个二叉树,输出其镜像. 解法:交换所有非叶子结点的左右结点. #include<stdio.h> #include<iostream> using namespace std; struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; }; //树的镜像 void reseverBinaryTree(BinaryTreeNode* root){ if(root==NULL||(

《剑指Offer》题目:二叉树的镜像

题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像 题目分析:先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点.当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像. Java代码: class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x){ val = x ; } } public class MirrorBinaryTree { public void Mirror(

《剑指offer》:[60]把二叉树打印成多行

题目:从上到下安层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行. 例如,图(1)中二叉树以及打印结果为: 这个题其实很简单,我们只需要设置两个变量就可以搞定.一个变量表示当前层中还没有打印的结点数,另一个变量表示下一层结点的数目. 具体实现代码如下: #include <iostream> #include <queue> using namespace std; struct BinaryTree { int data; BinaryTree *pLeft; Bi