// 面试题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》第二十八题(对称的二叉树)相关推荐

  1. 剑指offer——面试题59:对称的二叉树

    剑指offer--面试题59:对称的二叉树 Solution1: 书上的思路就挺好的 书中的思路:针对二叉树的前序遍历,定义一种遍历算法,先遍历右子结点再遍历左子结点,并考虑进NULL的情况 /* s ...

  2. 剑指offer:面试题28. 对称的二叉树

    题目:对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1    / \   2 ...

  3. 牛客网(剑指offer) 第八题 跳台阶

    //题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. <?phpfunction jumpFloor($number) {if($number ...

  4. 剑指offer面试题28:对称的二叉树

    题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 示例 1: 输入:root = [1,2,2,3,4,4,3]               输 ...

  5. 剑指Offer第二版Java代码实现

    剑指Offer第二版Java代码实现 A.单例模式 面试题 2:实现Singleton模式 B.面试需要的基础知识 面试题 3:数组中重复的数字 面试题 4:二维数组的查找 面试题 5:替换空格 面试 ...

  6. 【剑指Offer】俯视50题之31 - 40题

    [剑指Offer]俯视50题之31 - 40题 面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面 ...

  7. 《剑指 Offer I》刷题笔记 20 ~ 30 题

    <剑指 Offer I>刷题笔记 20_30 动态规划(简单) 20. 斐波那契数列 _解法1:迭代 解法2:记忆化递归 解法3:动态规划 21. 青蛙跳台阶问题 _解法1:动态规划 22 ...

  8. 《剑指 Offer I》刷题笔记 11 ~ 19 题

    <剑指 Offer I>刷题笔记 11 ~ 19 题 查找算法(中等) 11. 二维数组中的查找 _解法 1:暴力迭代 解法 2:标志数 解法 3:逐行二分 12. 旋转数组的最小数字 _ ...

  9. 《剑指 Offer I》刷题笔记 1 ~10 题

    <剑指 Offer I>刷题笔记 1 ~10 题 栈与队列(简单) 1. 用两个栈实现队列 _解法 1:暴力做法 解法 2:优化解法 1 2. 包含 min 函数的栈 _解法 1:pop( ...

  10. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

最新文章

  1. IBM X3550 RAID 扩容实例
  2. wincc报表步骤实例_Wincc 如何连接SQL Server 数据库
  3. hdu 1723 DP/递推
  4. python常用的十进制、16进制之间的转换
  5. [转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib
  6. HDU 1527 取石子游戏
  7. C/C++[codeup 1967]数组逆置
  8. Delphi版 熊猫烧香源码
  9. 详细名单:Google的581个域名
  10. 拼写检查(深度讲解,普通方法+进阶版)
  11. 生活娱乐 360安全卫士和QQ大战
  12. python中base函数_详细的python basemap中各函数的所有参量注释
  13. APP强制更新(uni-app)
  14. linux虚拟机防火墙关不了怎么办,虚拟机centOS7 关闭防火墙后ping通 telnet不通 解决办法:disable seLinux...
  15. “知识分享与交流”活动有感
  16. (转)人在德国:芦笋季节话芦笋
  17. 旅游推荐系统python_Python 实现推荐系统
  18. 如何自己搭建一个个人网站?
  19. 辨析 dB、dBm、dBw
  20. [OpenCV] CV_32F与CV_8U之间的数据类型转换

热门文章

  1. python 字符串详解
  2. while循环练习23
  3. PowerDesigner 常用配置修改
  4. Servlet(JSP)中动态生成JPG PNG透明 水印图像
  5. another app is currently holding the yum lock;waiting for it to exit...
  6. C# 视频监控系列(15):总结贴——可能用到的C# WinForm技术小结
  7. ext教程_exe_作者blackant
  8. windows c++版faster-rcnn
  9. python寻找1000以内的阿姆斯特朗数
  10. vs 编译器的堆空间不足_原创|面试官:Java对象一定分配在堆上吗?