题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
递归解题思路:
1、按照先遍历左结点,再遍历右节点的顺序遍历该二叉树
2、按照先遍历右结点,再遍历左结点的顺序遍历该二叉树
3、如果两次结果相同,则是对称二叉树,否则,不是对称二叉树
代码实现:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
/*
解题思路:
1、按照先遍历左结点,再遍历右节点的顺序遍历该二叉树
2、按照先遍历右结点,再遍历左结点的顺序遍历该二叉树
3、如果两次结果相同,则是对称二叉树,否则,不是对称二叉树
*/
return isSymmetry(pRoot,pRoot);
}
bool isSymmetry(TreeNode* pRoot1,TreeNode* pRoot2){
if(pRoot1 ==NULL && pRoot2 == NULL){
return true;
}
if(pRoot1 == NULL || pRoot2 == NULL){
return false;
}
if(pRoot1->val != pRoot2->val){
return false;
}
return isSymmetry(pRoot1->left,pRoot2->right)&&isSymmetry(pRoot1->right,pRoot2->left);
}
};
效率:
非递归解题思路:
1、设置两个队列,分别代表左子树和右子树;
2、一个队列从左往右添加结点,一个队列从右往左添加结点
3、出队后判断两个队列的出队元素的值是否相同
4、直到遍历完整棵树,队列为空。否则不是对称二叉树
代码实现:
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
/*
解题思路:
1、设置两个队列,分别代表左子树和右子树;
2、一个队列从左往右添加结点,一个队列从右往左添加结点
3、出队后判断两个队列的出队元素的值是否相同
4、直到遍历完整棵树,队列为空。否则不是对称二叉树
*/
if(pRoot == null){
return true;
}
Queue<TreeNode> leftQueue = new LinkedList<TreeNode>();
Queue<TreeNode> rightQueue = new LinkedList<TreeNode>();
leftQueue.offer(pRoot.left);
rightQueue.offer(pRoot.right);
while(leftQueue.size()!=0 && rightQueue.size()!=0){
TreeNode leftNode = leftQueue.poll();
TreeNode rightNode = rightQueue.poll();
if(leftNode==null && rightNode==null){
continue;
}
if(leftNode==null || rightNode==null){
return false;
}
if(leftNode.val != rightNode.val){
return false;
}
leftQueue.offer(leftNode.left);
leftQueue.offer(leftNode.right);
rightQueue.offer(rightNode.right);
rightQueue.offer(rightNode.left);
}
return leftQueue.size()==0 && rightQueue.size()==0;
}
}