题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:分为递归和迭代版本。
递归版本,这道题要理解题目意思,是左子树的左节点等于右子树的右节点才是对称的,自己写成了左子树的左节点和右节点是否相等了,需要一个递归的helper函数。比较的时候只比较返回false的情况就可以了。
1)只有一个为空;
2)两者不为空,但是两者值不相等。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: bool helper(TreeNode *Left,TreeNode *Right){ if(Left == nullptr && Right== nullptr){ return true; } else if(Left == nullptr || Right == nullptr){ return false; } else if(Left->val != Right->val){ return false; } return helper(Left->left,Right->right) && helper(Left->right,Right->left); } bool isSymmetrical(TreeNode* pRoot){ if(pRoot == nullptr){ return true; } return helper(pRoot->left,pRoot->right); } };
循环版本:
使用一个栈,分别将左子树的左节点和右子树的右节点压入stack,然后将左子树的右节点和右子树的左节点压入栈。每次循环弹出两个元素看是否相等,是否为空的上面的判断。一定要注意两个都为空的时候要continue,后面压栈的时候需要访问左右节点。不continue的会访问空节点。
/* 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){ if(pRoot == nullptr){ return true; } stack<TreeNode*> s; TreeNode *p,*q; p = pRoot -> left; q = pRoot -> right; s.push(p),s.push(q); while(s.size() != 0){ p = s.top(),s.pop(); q = s.top(),s.pop(); if(p == nullptr && q == nullptr){ continue; } if(p == nullptr || q == nullptr){ return false; } if(p->val != q->val){ return false; } s.push(p->left),s.push(q->right); s.push(p->right),s.push(q->left); } return true; } };