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
Follow up: Solve it both recursively and iteratively.
2. 题解
- 解题思路1:①使用二叉树中序遍历,如果遍历结果左右对称则说明此树为二叉树。
需要注意的是,这个前提并不正确,我们知道仅根据中序二叉树无法还原一颗二叉树,因此不能使用这个方法。如下面这两棵树:
* 1 1
* / \ / \
* 2 2 3 2
* / \ / \ \ / \
* 3 4 4 3 4 4 3
* /
* 2
中序遍历结果是一样的==(3-2-4-1-4-2-3)==,但第二颗明显不是对称二叉树。
-
解题思路2: 同时遍历左右子树,然后判断左右子树的节点值是否相同。
代码实现如下:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ /* * 中序遍历的结果左右对称便可以表明为对称二叉树??? *答案是否定的,例子如下: * * 1 1 * / \ / \ * 2 2 3 2 * / \ / \ \ / \ * 3 4 4 3 4 4 3 * / * 2 * 仅仅通过中序遍历无法复原一颗二叉树 */ bool isSymmetricLeftRight(struct TreeNode* left, struct TreeNode *right){ if(left == right){/*both NULL*/ return 1; }else if(NULL == left || NULL == right){ return 0; }else if(left->val != right->val){ return 0; } return isSymmetricLeftRight(left->left, right->right) && isSymmetricLeftRight(left->right, right->left); } bool isSymmetric(struct TreeNode* root){ if(NULL == root){/*如果root为空,是否应该为对称树,最好有个统一的规定*/ return 1; } return isSymmetricLeftRight(root->left, root->right); }
结果如下: