前言
对称二叉树是二叉树中的基础问题,下面我们从递归和迭代的角度解决它。
题目描述
给你一个二叉树的根节点 root , 检查它是否轴对称。
例如:
一、递归法
通过对称二叉树的定义,我们可以看到,将每三层二叉树看作一个部分观察,可以分为外侧和内侧。外侧的两个节点的值对应相等,内侧的两个节点的值对应相等,依次判断即可。当出现left,right为空指针时,或者left和right对应的值不相等,则返回false。否则返回true。
我们从递归三要素分析:
递归三要素
调用参数和返回值
终止情况
递归逻辑
- 首先,依据题意,我们需要返回一个bool类型的数据。至于参数,我们递归时是对二叉树的两个子树进行递归,所以我们选择两个指针TreeNode* left, TreeNode* right。
- 关于终止情况,我们分析时发现有四种情况可以直接返回结果:
left != NULL && right == NULL
left == NULL && right != NULL
left == NULL && right == NULL
left->val != right->val
- 递归逻辑:对于图示的结构,判断其外侧节点的值是否相等,判断其内测节点的值是否相等。返回 outside&&inside
代码如下:
//递归法
bool compare(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 = compare(left->left, right->right);
bool inside = compare(left->right, right->left);
return outside && inside;
}
bool isSymmetric1(TreeNode* root) {
if (root == NULL) return true;
return compare(root->left, root->right);
}
二、迭代法
1.使用队列
队列先进先出
我们用队列模拟一下实例:
//用队列迭代
bool isSymmetric2(TreeNode* root) {
if (root == NULL) return true;
queue <TreeNode*> que;
que.emplace(root->left);
que.emplace(root->right);
while (!que.empty()) {
TreeNode* leftNode = que.front(); que.pop();
TreeNode* rightNode = que.front(); que.pop();
if (leftNode == NULL && rightNode == NULL) continue;
if (leftNode != NULL && right == NULL || leftNode == NULL && right != NULL || leftNode->val != rightNode->val) return false;
que.emplace(leftNode->left);
que.emplace(rightNode->right);
que.emplace(leftNode->right);
que.emplace(rightNode->left);
}
return true;
}
2.使用栈
用栈写的代码看上去只是把queue改成了stack,其实底层逻辑并不相同。
栈是先进后出的,我们用栈来模拟一下:
//用栈迭代
bool isSymmetric3(TreeNode* root) {
if (root == NULL) return true;
stack <TreeNode*> st;
st.emplace(root->left);
st.emplace(root->right);
while (!st.empty()) {
TreeNode* leftNode = st.top(); st.pop();
TreeNode* rightNode =st.top(); st.pop();
if (leftNode == NULL && rightNode == NULL) continue;
if (leftNode != NULL && right == NULL || leftNode == NULL && right != NULL || leftNode->val != rightNode->val) return false;
st.emplace(leftNode->left);
st.emplace(rightNode->right);
st.emplace(leftNode->right);
st.emplace(rightNode->left);
}
return true;
}