剑指offer之中判断二叉树是不是对称二叉树(递归和非递归实现)

举报
chenyu 发表于 2021/07/27 01:33:43 2021/07/27
【摘要】 1 问题 判断二叉树是不是对称(递归和非递归实现) 如下二叉树,就是对称的二叉树 2 3 3 1 4 4 1 如下二叉树,就是非对称的二叉树  2 3 3 1 4 4 2           2 代码实现 #include <iostream>#inclu...

1 问题

判断二叉树是不是对称(递归和非递归实现)

如下二叉树,就是对称的二叉树


  
  1. 2
  2. 3 3
  3. 1 4 4 1

如下二叉树,就是非对称的二叉树 


  
  1. 2
  2. 3 3
  3. 1 4 4 2

 

 

 

 

 

2 代码实现


  
  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. #define true 1
  5. #define false 0
  6. typedef struct Node
  7. {
  8. int value;
  9. struct Node* left;
  10. struct Node* right;
  11. } Node;
  12. int isSymmetricTree(Node *head);
  13. int isSymmetric(Node *left, Node *right);
  14. int isSymmetricTree1(Node *head);
  15. /*
  16. *判断是否是对称二叉树(递归实现)
  17. */
  18. int isSymmetricTree(Node *head)
  19. {
  20. if (head == NULL)
  21. {
  22. return true;
  23. }
  24. return isSymmetric(head, head);
  25. }
  26. int isSymmetric(Node *left, Node *right)
  27. {
  28. if (left == NULL && right == NULL)
  29. {
  30. return true;
  31. }
  32. if (left == NULL || right == NULL)
  33. {
  34. return false;
  35. }
  36. if (left->value != right->value)
  37. {
  38. return false;
  39. }
  40. return isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left);
  41. }
  42. /*
  43. *判断是否是对称二叉树(非递归实现)
  44. */
  45. int isSymmetricTree1(Node *head)
  46. {
  47. if (head == NULL)
  48. {
  49. return true;
  50. }
  51. std::queue<Node *> queue1;
  52. std::queue<Node *> queue2;
  53. queue1.push(head->left);
  54. queue2.push(head->right);
  55. while(!queue1.empty() || !queue2.empty())
  56. {
  57. Node *left = queue1.front();
  58. Node *right = queue2.front();
  59. if ((left != NULL) && (right == NULL))
  60. {
  61. return false;
  62. }
  63. if ((left == NULL) && (right != NULL))
  64. {
  65. return false;
  66. }
  67. //因为上面情况只包含left为NULL和right不为NULL以及left不为NULL和right为NULL,
  68. //还包含2种情况,left和right都为NULL,以及left和right都不为NULL,所以我们left->value和right->判断相等的时候
  69. //一定要记得对left和right都不是NULL的前提下才能调用->,下次切记,看到指针->的时候需要判断指针是否为NULL
  70. //left和right都为NULL的时候,我们直接对queue1和queue2进行pop()操作
  71. if (left && right && (left->value != right->value))
  72. {
  73. return false;
  74. }
  75. queue1.pop();
  76. queue2.pop();
  77. if (left != NULL)
  78. {
  79. queue1.push(left->left);
  80. queue1.push(left->right);
  81. }
  82. if (right != NULL)
  83. {
  84. queue2.push(right->right);
  85. queue2.push(right->left);
  86. }
  87. }
  88. return true;
  89. }
  90. int main()
  91. {
  92. /* 2
  93. * 3 3
  94. * 1 4 4 1
  95. *
  96. */
  97. Node head1, node1, node2, node3, node4, node5, node6;
  98. Node head2, node7, node8;
  99. head1.value = 2;
  100. node1.value = 3;
  101. node2.value = 3;
  102. node3.value = 1;
  103. node4.value = 4;
  104. node5.value = 4;
  105. node6.value = 1;
  106. head1.left = &node1;
  107. head1.right = &node2;
  108. node1.left = &node3;
  109. node1.right = &node4;
  110. node2.left = &node5;
  111. node2.right = &node6;
  112. node3.left = NULL;
  113. node3.right = NULL;
  114. node4.left = NULL;
  115. node4.right = NULL;
  116. node5.left = NULL;
  117. node5.right = NULL;
  118. node6.left = NULL;
  119. node6.right = NULL;
  120. if (isSymmetricTree(&head1))
  121. {
  122. std::cout << "tree is symmertric" << std::endl;
  123. }
  124. else
  125. {
  126. std::cout << "tree is not symmertric" << std::endl;
  127. }
  128. if (isSymmetricTree1(&head1))
  129. {
  130. std::cout << "tree is symmertric" << std::endl;
  131. }
  132. else
  133. {
  134. std::cout << "tree is not symmertric" << std::endl;
  135. }
  136. return 0;
  137. }

 

 

 

3 运行结果


  
  1. tree is symmertric
  2. tree is symmertric

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/90683562

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。