题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
我的想法:
1.堆成二叉树中序遍历是个回文串
2.层次遍历,每一层都是回文串
发现问题:
写一半发现示例中下图中序不是回文串,方法一不成立。
写了半天发现方法二不成立,上图不是对称,方法一才是对的。
我的代码:
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- bool isSymmetric(TreeNode* root) {
-
- vector<int> result;
- stack
st; - TreeNode* cur = root;
- while (cur != NULL || !st.empty()) {
- if (cur != NULL) {
- st.push(cur);
- cur = cur->left;
- } else {
- cur = st.top();
- st.pop();
- result.push_back(cur->val);
- cur = cur->right;
- }
- }
- return isHuiwen(result);
-
- }
-
- bool isHuiwen(vector<int> &res)
- {
- int i = 0;
- int j = res.size() - 1;
- while(i <= j)
- {
- if(res[i] != res[j])
- {
- return false;
- }
- i++;
- j--;
- }
- return true;
- }
-
- };
随想录解法:
递归法:
bool compare(TreeNode* left, TreeNode* right)
- class Solution {
- public:
- 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); // 左子树:右、 右子树:左
- bool isSame = outside && inside; // 左子树:中、 右子树:中 (逻辑处理)
- return isSame;
-
- }
- bool isSymmetric(TreeNode* root) {
- if (root == NULL) return true;
- return compare(root->left, root->right);
- }
- };