[LeetCode]对称二叉树

来源:互联网 发布:windows.iso怎样安装 编辑:程序博客网 时间:2024/06/07 00:29

[LeetCode]对称二叉树

0.题目

leetcode : 101. Symmetric Tree

1.题目描述

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

    1   / \  2   2 / \ / \3  4 4  3

But the following [1,2,2,null,3,null,3] is not:

    1   / \  2   2   \   \   3    3

2.题目分析

二叉树中对称的定义我们可以用下面一张图来解释 :

            |            1          / | \         2  |  2        / \ | / \       3  4 | 4  3      / \   |   / \     6   7  |  7   6            |

仔细观察示意图我们可以发现:
1. 整棵树关于中间虚线对称
2. 左右子树也关于虚线对称
3. 就节点2而言,左边节点2的左子树和右边节点2的右子树对称;左边节点2的右子树和右边节点2的左子树对称。

由此我们可以得到递归的判断方式:
1. 左节点的值与右节点的值相同
2. 左节点的右子树与右节点的左子树对称
3. 左节点的左子树与右节点的右子树对称

通过递归的判断我们就能很简单的判断一棵树是否属于对称二叉树。

3.代码实现

完整代码:

bool isSymmetric(TreeNode *root) {    if (root == NULL) {        return true;    } else if (root->left == NULL && root->right == NULL) {        return true;    } //只有根节点或者连根节点都没有    return symmetric(root->left, root->right);}bool symmetric(TreeNode *left, TreeNode *right) { //判断两棵子树是否关于中线对称    if (left == NULL && right == NULL) {        return true; // 子树为空树    } else if (left== NULL || right == NULL) {        return false; // 一棵树为空而另一棵非空    }    if (left->val != right->val) {        return false; // 值不同肯定不对称    }    return symmetric(left->left, right->right) &&    symmetric(left->right, right->left); //递归判断}

4.结束

解题关键在于找到递归的定义,代码实现并不难。

原创粉丝点击