一.题目描述
给你一个二叉树的根节点 root
, 检查它是否轴对称。
输入:root = [1,2,2,3,4,4,3] 输出:true
二.思路
首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!比较的是两个子树的里侧和外侧的元素是否相等。如图所示:
该题需要同时遍历两棵树,从外到内的遍历可以采用后序遍历方法,及左树顺序为左右中,右树为右左中。
对于二叉树后序遍历可以采用递归法和迭代法解决。
三.代码
//递归法
class Solution {
public:
bool compare(TreeNode* left, TreeNode* right)
{
//对两个节点进行判断
if(left==nullptr&&right!=nullptr) return false;
else if (left != nullptr && right == nullptr) return false;
else if (left==nullptr &&right==nullptr) return true;
else if(left->val !=right->val) return false;
//节点值相同情况,做下一层判断
//从外到内的顺序
bool outside=compare(left->left,right->right);
bool inside=compare(left->right,right->left);
bool isSame = outside && inside;
return isSame;
}
bool isSymmetric(TreeNode* root) {
if (root == NULL) return true;
return compare(root->left, root->right);
}
};
//迭代法
bool isSymmetric(TreeNode* root) {
if(root==nullptr) return true;
stack<TreeNode*>st;
st.push(root->left);
st.push(root->right);
while(!st.empty())
{
TreeNode*left=st.top();
st.pop();
TreeNode*right=st.top();
st.pop();
if(!left&&!right)//左右同时为空,对称,跳过该次循环,不向下遍历
continue;
if(!left || !right ||(left->val!=right->val))
return false;
st.push(left->left);
st.push(right->right);
st.push(left->right);
st.push(right->left);
}
return true;
}