判断二叉树是否对称-递归和迭代
给定二叉树,检查它是否是镜像对称的。
例如,二叉树[1,2,2,3,4,4,3]是对称的。
但是下面这个[1,2,2,nu11,3,nu11,3]则不是镜像对称的:
分析:注意null位置,如果先左右中(后序)遍历一遍,再右左中遍历,两者数组一样,也并不能说明二叉树镜像,一定要同时从两个方向遍历同一个树。
#include "_myPrint.cpp"
#include "stack"
#include "queue"
using namespace std;
// 判断一颗二叉树是不是对称的
class Solution{
public:
// 确定递归的参数和返回值
// 确定每一层递归需要做的事情
// 确定递归的终止条件
bool isSymmetric(TreeNode* left, TreeNode* right){ // 后序遍历
// 递归结束的条件
if (left == NULL && right != NULL) return false;
else if (left != NULL && right == NULL) return false;
else if (left == NULL && right == NULL) return true;
else if (left -> val != right -> val) return false;
// 一层递归需要做的事情
// 这里必须使用后序遍历 需要获取到左右的值做判断 (左右中)
bool outside = isSymmetric(left -> left, right -> right);
bool inside = isSymmetric(left -> right, right -> left);
bool isSame = outside && inside;
return isSame;
}
// 能递归就能迭代
bool isSymmetric_(TreeNode* root){
// 使用容器存放左右子树按照顺序的节点值序列
if (!root) return true;
stack<TreeNode*> st;
st.push(root -> left);
st.push(root -> right);
while (!st.empty()){
TreeNode* node1 = st.top(); st.pop();
TreeNode* node2 = st.top(); st.pop();
// 两个节点都为空 说明遇到叶子节点了 一般continue 对应递归法里面的return 否则会一直push NULL进入stack
if (!node1 && !node2) continue;
if (!node1 && node2 || node1 && !node2 || node1 -> val != node2 -> val) return false;
st.push(node1 -> left);
st.push(node2 -> right);
st.push(node1 -> right);
st.push(node2 -> left);
}
return true;
}
bool isSys(TreeNode* root){
if (!root) return true;
bool res = isSymmetric(root -> left, root -> right);
return res;
}
};
int main(){
Solution s;
TreeNode* root = new TreeNode(8);
TreeNode* l = new TreeNode(6);
TreeNode* r = new TreeNode(7);
root->left = l;
root->right = r;
bool res = s.isSymmetric_(root);
cout << res << endl;
}