《剑指offer》:[59]对称的二叉树

题目;请实现一个函数,用来判断一棵二叉树是不是对称的。如果一颗二叉树和它的镜像一样,那么它是对称的。

例如,下面二棵树图(1)就是对称的二叉树,而图(2)(3)就不是的。

分析:我们知道树的遍历有三种方式:前,中,后。顾名思义,对称就是左边的和右边的相等,中间的自己等于自己。所以我们自己可以定义一种对称遍历算法,例如前序遍历中的前,左,右。对称算法就是:前,右,左。刚好对称比较。当然了其他的中和后序遍历也行,我们也可以定义与其对应的对称算法。但是其中为了避免出现树(3)中的遍历出来的数据一样,造成误判,我们需要对叶子结点加上标识,如空节点需要设置为NULL。而不能只是比较遍历后的数据。

具体是实现代码如下:

#include <iostream>
using namespace std;
struct BinaryTree
{
	int data;
	BinaryTree *pLeft;
	BinaryTree *pRight;
};
BinaryTree *pRoot1=NULL;
BinaryTree *pRoot2=NULL;
BinaryTree *pRoot3=NULL;
void CreateTree(BinaryTree * &root)
{
	int data;
	cin>>data;
	if(0==data)
		root=NULL;
	else
	{
		root=new BinaryTree;
		root->data=data;
		//前序遍历构建二叉树;
		CreateTree(root->pLeft);
		CreateTree(root->pRight);
	}
}
bool IsSymmetricalHelp(BinaryTree *root1,BinaryTree *root2)
{
	if(root1==NULL && root2==NULL)
		return true;
	if(root1==NULL || root2==NULL)//把null也算上,很重要,防止数据一样的特殊情况;
		return false;
	if(root1->data!=root2->data)
		return false;
	return IsSymmetricalHelp(root1->pLeft,root2->pRight)
		&& IsSymmetricalHelp(root1->pRight,root2->pLeft);
}
bool IsSymmetrical(BinaryTree *root)
{
	return IsSymmetricalHelp(root,root);
}
void PreOrder(BinaryTree *root)
{
	if(root)
	{
		cout<<root->data<<" ";
		PreOrder(root->pLeft);
		PreOrder(root->pRight);
	}
}
void UntiPreOrder(BinaryTree *root)
{
	if(root)
	{
		cout<<root->data<<" ";
		PreOrder(root->pRight);
		PreOrder(root->pLeft);
	}
}
int main()
{
	bool result=false;
	CreateTree(pRoot1);
	cout<<"树1的--前序遍历:";
	PreOrder(pRoot1);
	cout<<endl;
	cout<<"树1的反前序遍历:";
	UntiPreOrder(pRoot1);
	result=IsSymmetrical(pRoot1);
	if(result)
		cout<<endl<<"该树是对称树!"<<endl;
	else
		cout<<"该树不是对称树!"<<endl;
	cout<<endl;

	CreateTree(pRoot2);//树3虽然遍历一样,但是不是对成树!
	cout<<"树2的--前序遍历:";
	PreOrder(pRoot2);
	cout<<endl;
	cout<<"树2的反前序遍历:";
	UntiPreOrder(pRoot2);
	cout<<endl;
	result=IsSymmetrical(pRoot2);
	if(result)
		cout<<"该树是对称树!"<<endl;
	else
		cout<<"该树不是对称树!"<<endl;
	cout<<endl;
	system("pause");
	return 0;
}

运行结果如下;

时间: 2024-10-05 05:31:04

《剑指offer》:[59]对称的二叉树的相关文章

剑指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 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:对称的二叉树

题目描述请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 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 59.树 按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 用一个栈s1来存放奇数层节点,另一个栈s2来存放偶数层节点 代码如下 public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { int layer = 1; //s1存奇数层节点 Stack<TreeNode> s1 = new Stack&

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