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

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

 1 package com.exe7.offer;
 2
 3 /**
 4  * 【题目】请实现一个函数,用来判断一颗二叉树是不是对称的。
 5  *     注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
 6  * @author WGS
 7  *
 8  */
 9 public class SymmetricalTreeNode {
10     public class TreeNode{
11         int val=0;
12         TreeNode left=null;
13         TreeNode right=null;
14
15         public TreeNode(int val){
16             this.val=val;
17         }
18     }
19
20
21     public boolean isSymmetrical(TreeNode pRoot){
22         if(pRoot==null) return false;
23         return isSymmetrical(pRoot.left ,pRoot.right);
24     }
25
26
27     private boolean isSymmetrical(TreeNode pLeft, TreeNode pRight) {
28         if(pLeft==null && pRight==null ) return true;
29         if(pLeft==null || pRight==null ) return false;
30         if(pLeft.val!=pRight.val)
31             return false;
32         return isSymmetrical(pLeft.left, pRight.right)
33             && isSymmetrical(pLeft.right, pRight.left);
34     }
35 }
时间: 2024-10-29 20:41:14

剑指offer系列32-----对称二叉树的判断的相关文章

剑指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系列——32.把数组排成最小的数

Q:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. T: 把数组排序,排序后从第一个值开始,假如有元素a和元素b,若ab > ba 则 a应该处于b之后:若ab < ba 则a应该处于b之前:若ab = ba 则 a = b:解释说明:比如 "3" 和 "31"比较谁先谁后, "331" > &quo

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

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

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

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

剑指offer系列4:斐波那契数列

剑指offer第九题,这个题很古老了.第一个想到的肯定是递归,很简单. 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 int Fibonacci(int n) { 7 if (n == 0) 8 { 9 return 0; 10 } 11 if (n==1||n==2) 12 { 13 return 1; 14 } 15 else 16 {

剑指offer系列——48.不用加减乘除做加法

Q:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. T: 1.使用进制. 两个数异或:相当于每一位相加,而不考虑进位: 两个数相与,并左移一位:相当于求得进位: 将上述两步的结果相加 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果. 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12. 同样我们可以用三步走的方