《剑指offer》第二十八题(对称的二叉树)
// 面试题28:对称的二叉树 // 题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和 // 它的镜像一样,那么它是对称的。 #include <iostream> #include "BinaryTree.h"bool isSymmetrical(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2);bool isSymmetrical(BinaryTreeNode* pRoot) {return isSymmetrical(pRoot, pRoot); }bool isSymmetrical(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) {if (pRoot1 == nullptr && pRoot2 == nullptr)//当二者都为空,truereturn true;if (pRoot1 == nullptr || pRoot2 == nullptr)//只有一个为空,flasereturn false;if (pRoot1->m_nValue != pRoot2->m_nValue)//当二者值不等,flasereturn false;return isSymmetrical(pRoot1->m_pLeft, pRoot2->m_pRight)&& isSymmetrical(pRoot1->m_pRight, pRoot2->m_pLeft);//看看你镜像和我是不是一样~ }//注意这里有个关键是,要测试是否都是空的,详见test9和10// ====================测试代码==================== void Test(const char* testName, BinaryTreeNode* pRoot, bool expected) {if (testName != nullptr)printf("%s begins: ", testName);if (isSymmetrical(pRoot) == expected)printf("Passed.\n");elseprintf("FAILED.\n"); }// 8 // 6 6 // 5 7 7 5 void Test1() {BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);BinaryTreeNode* pNode61 = CreateBinaryTreeNode(6);BinaryTreeNode* pNode62 = CreateBinaryTreeNode(6);BinaryTreeNode* pNode51 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode71 = CreateBinaryTreeNode(7);BinaryTreeNode* pNode72 = CreateBinaryTreeNode(7);BinaryTreeNode* pNode52 = CreateBinaryTreeNode(5);ConnectTreeNodes(pNode8, pNode61, pNode62);ConnectTreeNodes(pNode61, pNode51, pNode71);ConnectTreeNodes(pNode62, pNode72, pNode52);Test("Test1", pNode8, true);DestroyTree(pNode8); }// 8 // 6 9 // 5 7 7 5 void Test2() {BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);BinaryTreeNode* pNode61 = CreateBinaryTreeNode(6);BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9);BinaryTreeNode* pNode51 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode71 = CreateBinaryTreeNode(7);BinaryTreeNode* pNode72 = CreateBinaryTreeNode(7);BinaryTreeNode* pNode52 = CreateBinaryTreeNode(5);ConnectTreeNodes(pNode8, pNode61, pNode9);ConnectTreeNodes(pNode61, pNode51, pNode71);ConnectTreeNodes(pNode9, pNode72, pNode52);Test("Test2", pNode8, false);DestroyTree(pNode8); }// 8 // 6 6 // 5 7 7 void Test3() {BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);BinaryTreeNode* pNode61 = CreateBinaryTreeNode(6);BinaryTreeNode* pNode62 = CreateBinaryTreeNode(6);BinaryTreeNode* pNode51 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode71 = CreateBinaryTreeNode(7);BinaryTreeNode* pNode72 = CreateBinaryTreeNode(7);ConnectTreeNodes(pNode8, pNode61, pNode62);ConnectTreeNodes(pNode61, pNode51, pNode71);ConnectTreeNodes(pNode62, pNode72, nullptr);Test("Test3", pNode8, false);DestroyTree(pNode8); }// 5 // / \ // 3 3 // / \ // 4 4 // / \ // 2 2 // / \ // 1 1 void Test4() {BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode31 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode32 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode41 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode42 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode21 = CreateBinaryTreeNode(2);BinaryTreeNode* pNode22 = CreateBinaryTreeNode(2);BinaryTreeNode* pNode11 = CreateBinaryTreeNode(1);BinaryTreeNode* pNode12 = CreateBinaryTreeNode(1);ConnectTreeNodes(pNode5, pNode31, pNode32);ConnectTreeNodes(pNode31, pNode41, nullptr);ConnectTreeNodes(pNode32, nullptr, pNode42);ConnectTreeNodes(pNode41, pNode21, nullptr);ConnectTreeNodes(pNode42, nullptr, pNode22);ConnectTreeNodes(pNode21, pNode11, nullptr);ConnectTreeNodes(pNode22, nullptr, pNode12);Test("Test4", pNode5, true);DestroyTree(pNode5); }// 5 // / \ // 3 3 // / \ // 4 4 // / \ // 6 2 // / \ // 1 1 void Test5() {BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode31 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode32 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode41 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode42 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);BinaryTreeNode* pNode22 = CreateBinaryTreeNode(2);BinaryTreeNode* pNode11 = CreateBinaryTreeNode(1);BinaryTreeNode* pNode12 = CreateBinaryTreeNode(1);ConnectTreeNodes(pNode5, pNode31, pNode32);ConnectTreeNodes(pNode31, pNode41, nullptr);ConnectTreeNodes(pNode32, nullptr, pNode42);ConnectTreeNodes(pNode41, pNode6, nullptr);ConnectTreeNodes(pNode42, nullptr, pNode22);ConnectTreeNodes(pNode6, pNode11, nullptr);ConnectTreeNodes(pNode22, nullptr, pNode12);Test("Test5", pNode5, false);DestroyTree(pNode5); }// 5 // / \ // 3 3 // / \ // 4 4 // / \ // 2 2 // \ // 1 void Test6() {BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode31 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode32 = CreateBinaryTreeNode(3);BinaryTreeNode* pNode41 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode42 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode21 = CreateBinaryTreeNode(2);BinaryTreeNode* pNode22 = CreateBinaryTreeNode(2);BinaryTreeNode* pNode12 = CreateBinaryTreeNode(1);ConnectTreeNodes(pNode5, pNode31, pNode32);ConnectTreeNodes(pNode31, pNode41, nullptr);ConnectTreeNodes(pNode32, nullptr, pNode42);ConnectTreeNodes(pNode41, pNode21, nullptr);ConnectTreeNodes(pNode42, nullptr, pNode22);ConnectTreeNodes(pNode21, nullptr, nullptr);ConnectTreeNodes(pNode22, nullptr, pNode12);Test("Test6", pNode5, false);DestroyTree(pNode5); }// 只有一个结点 void Test7() {BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);Test("Test7", pNode1, true);DestroyTree(pNode1); }// 没有结点 void Test8() {Test("Test8", nullptr, true); }// 所有结点都有相同的值,树对称 // 5 // / \ // 5 5 // / \ // 5 5 // / \ // 5 5 void Test9() {BinaryTreeNode* pNode1 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode21 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode22 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode31 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode32 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode41 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode42 = CreateBinaryTreeNode(5);ConnectTreeNodes(pNode1, pNode21, pNode22);ConnectTreeNodes(pNode21, pNode31, nullptr);ConnectTreeNodes(pNode22, nullptr, pNode32);ConnectTreeNodes(pNode31, pNode41, nullptr);ConnectTreeNodes(pNode32, nullptr, pNode42);ConnectTreeNodes(pNode41, nullptr, nullptr);ConnectTreeNodes(pNode42, nullptr, nullptr);Test("Test9", pNode1, true);DestroyTree(pNode1); }// 所有结点都有相同的值,树不对称 // 5 // / \ // 5 5 // / \ // 5 5 // / / // 5 5 void Test10() {BinaryTreeNode* pNode1 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode21 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode22 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode31 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode32 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode41 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode42 = CreateBinaryTreeNode(5);ConnectTreeNodes(pNode1, pNode21, pNode22);ConnectTreeNodes(pNode21, pNode31, nullptr);ConnectTreeNodes(pNode22, nullptr, pNode32);ConnectTreeNodes(pNode31, pNode41, nullptr);ConnectTreeNodes(pNode32, pNode42, nullptr);ConnectTreeNodes(pNode41, nullptr, nullptr);ConnectTreeNodes(pNode42, nullptr, nullptr);Test("Test10", pNode1, false);DestroyTree(pNode1); }void main(int argc, char* argv[]) {Test1();Test2();Test3();Test4();Test5();Test6();Test7();Test8();Test9();Test10();system("pause"); }
转载于:https://www.cnblogs.com/CJT-blog/p/10491586.html
《剑指offer》第二十八题(对称的二叉树)相关推荐
- 剑指offer——面试题59:对称的二叉树
剑指offer--面试题59:对称的二叉树 Solution1: 书上的思路就挺好的 书中的思路:针对二叉树的前序遍历,定义一种遍历算法,先遍历右子结点再遍历左子结点,并考虑进NULL的情况 /* s ...
- 剑指offer:面试题28. 对称的二叉树
题目:对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 ...
- 牛客网(剑指offer) 第八题 跳台阶
//题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. <?phpfunction jumpFloor($number) {if($number ...
- 剑指offer面试题28:对称的二叉树
题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 示例 1: 输入:root = [1,2,2,3,4,4,3] 输 ...
- 剑指Offer第二版Java代码实现
剑指Offer第二版Java代码实现 A.单例模式 面试题 2:实现Singleton模式 B.面试需要的基础知识 面试题 3:数组中重复的数字 面试题 4:二维数组的查找 面试题 5:替换空格 面试 ...
- 【剑指Offer】俯视50题之31 - 40题
[剑指Offer]俯视50题之31 - 40题 面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面 ...
- 《剑指 Offer I》刷题笔记 20 ~ 30 题
<剑指 Offer I>刷题笔记 20_30 动态规划(简单) 20. 斐波那契数列 _解法1:迭代 解法2:记忆化递归 解法3:动态规划 21. 青蛙跳台阶问题 _解法1:动态规划 22 ...
- 《剑指 Offer I》刷题笔记 11 ~ 19 题
<剑指 Offer I>刷题笔记 11 ~ 19 题 查找算法(中等) 11. 二维数组中的查找 _解法 1:暴力迭代 解法 2:标志数 解法 3:逐行二分 12. 旋转数组的最小数字 _ ...
- 《剑指 Offer I》刷题笔记 1 ~10 题
<剑指 Offer I>刷题笔记 1 ~10 题 栈与队列(简单) 1. 用两个栈实现队列 _解法 1:暴力做法 解法 2:优化解法 1 2. 包含 min 函数的栈 _解法 1:pop( ...
- 剑指Offer(十九):顺时针打印矩阵
剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
最新文章
- IBM X3550 RAID 扩容实例
- wincc报表步骤实例_Wincc 如何连接SQL Server 数据库
- hdu 1723 DP/递推
- python常用的十进制、16进制之间的转换
- [转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib
- HDU 1527 取石子游戏
- C/C++[codeup 1967]数组逆置
- Delphi版 熊猫烧香源码
- 详细名单:Google的581个域名
- 拼写检查(深度讲解,普通方法+进阶版)
- 生活娱乐 360安全卫士和QQ大战
- python中base函数_详细的python basemap中各函数的所有参量注释
- APP强制更新(uni-app)
- linux虚拟机防火墙关不了怎么办,虚拟机centOS7 关闭防火墙后ping通 telnet不通 解决办法:disable seLinux...
- “知识分享与交流”活动有感
- (转)人在德国:芦笋季节话芦笋
- 旅游推荐系统python_Python 实现推荐系统
- 如何自己搭建一个个人网站?
- 辨析 dB、dBm、dBw
- [OpenCV] CV_32F与CV_8U之间的数据类型转换
热门文章
- python 字符串详解
- while循环练习23
- PowerDesigner 常用配置修改
- Servlet(JSP)中动态生成JPG PNG透明 水印图像
- another app is currently holding the yum lock;waiting for it to exit...
- C# 视频监控系列(15):总结贴——可能用到的C# WinForm技术小结
- ext教程_exe_作者blackant
- windows c++版faster-rcnn
- python寻找1000以内的阿姆斯特朗数
- vs 编译器的堆空间不足_原创|面试官:Java对象一定分配在堆上吗?