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

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

1 问题

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

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

            2
               3     3           
             1  4   4  1 

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

            2
               3     3           
             1  4   4  2

2 代码实现

#include <iostream>
#include <queue>
using namespace std;
#define true 1
#define false 0
typedef struct Node
{
    int value;
    struct Node* left;
    struct Node* right;
} Node;
int isSymmetricTree(Node *head);
int isSymmetric(Node *left, Node *right);
int isSymmetricTree1(Node *head);
/*
 *判断是否是对称二叉树(递归实现)
 */
int isSymmetricTree(Node *head)
{
    if (head == NULL)
    {
  return true;
    }   
    return isSymmetric(head, head);
}
int isSymmetric(Node *left, Node *right)
{
    if (left == NULL && right == NULL)
    {
  return true;
    }
    if (left == NULL || right == NULL)
    {
        return false;
    }
    if (left->value != right->value)
    {
  return false;
    }
    return isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left);
} 
/*
 *判断是否是对称二叉树(非递归实现)
 */
int isSymmetricTree1(Node *head)
{
    if (head == NULL)
    {
    return true;
    }   
  std::queue<Node *> queue1;
  std::queue<Node *> queue2;
  queue1.push(head->left);
  queue2.push(head->right);
  while(!queue1.empty() || !queue2.empty())
  {
    Node *left = queue1.front();
    Node *right = queue2.front();
    if ((left != NULL) && (right == NULL))
    {
      return false;
    }
    if ((left == NULL) && (right != NULL))
    {
      return false;
    } 
    //因为上面情况只包含left为NULL和right不为NULL以及left不为NULL和right为NULL,
    //还包含2种情况,left和right都为NULL,以及left和right都不为NULL,所以我们left->value和right->判断相等的时候
    //一定要记得对left和right都不是NULL的前提下才能调用->,下次切记,看到指针->的时候需要判断指针是否为NULL
    //left和right都为NULL的时候,我们直接对queue1和queue2进行pop()操作
    if (left && right && (left->value != right->value))
    {
      return false;
    }
    queue1.pop();
    queue2.pop();
    if (left != NULL)
    {
      queue1.push(left->left);
      queue1.push(left->right);
    }
    if (right != NULL)
    {
      queue2.push(right->right);
      queue2.push(right->left);
    }
  }
    return true;
}
int main()
{
    /*              2
     *           3     3           
     *         1  4   4  1        
     *       
     */
    Node head1, node1, node2, node3, node4, node5, node6;
    Node head2, node7, node8;
    head1.value = 2;
    node1.value = 3;
    node2.value = 3;
    node3.value = 1;
    node4.value = 4;
    node5.value = 4;
    node6.value = 1;
    head1.left = &node1;
    head1.right = &node2;
    node1.left = &node3;
    node1.right = &node4;
    node2.left = &node5;
    node2.right = &node6;
    node3.left = NULL;
    node3.right = NULL;
    node4.left = NULL;
    node4.right = NULL;
    node5.left = NULL;
    node5.right = NULL;
    node6.left = NULL;
    node6.right = NULL;
    if (isSymmetricTree(&head1))
    {
  std::cout << "tree is symmertric" << std::endl;
    }
    else
    {
  std::cout << "tree is not symmertric" << std::endl;
    }
    if (isSymmetricTree1(&head1))
    {
  std::cout << "tree is symmertric" << std::endl;
    }
    else
    {
  std::cout << "tree is not symmertric" << std::endl;
    }
    return 0;
}

3 运行结果

tree is symmertric
tree is symmertric
相关文章
|
8月前
leetcode94二叉树的中序遍历(迭代做法)
leetcode94二叉树的中序遍历(迭代做法)
52 0
|
7月前
|
存储 算法 编译器
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
48 0
|
7月前
|
存储 SQL 算法
LeetCode 题目 94:五种算法递归|迭代|莫里斯|线索二叉树|栈的迭代二叉树 实现中序遍历
LeetCode 题目 94:五种算法递归|迭代|莫里斯|线索二叉树|栈的迭代二叉树 实现中序遍历
|
7月前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
74 0
|
8月前
|
算法
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
175 0
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
递归与非递归实现二叉树的前中后序遍历!!
递归与非递归实现二叉树的前中后序遍历!!
55 0
|
算法 容器
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力(下
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力
95 0
|
算法 UED 容器
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力(上)
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力
130 0
|
C++
剑指Offer - 面试题7:重构二叉树 (力扣 - 105、从前序与中序遍历序列构造二叉树)
剑指Offer - 面试题7:重构二叉树 (力扣 - 105、从前序与中序遍历序列构造二叉树)
72 0