刷题笔记day15

二叉树的层序遍历

文章讲解:代码随想录
是否自己做出来通过全部用例:是

自己写的代码

迭代法:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> que;
        vector<vector<int>> res;
        if (root) que.push(root);
        while (!que.empty()) {
            vector<int> vec;
            int size = que.size();
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                vec.push_back(node->val);
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
            res.push_back(vec);
        }
        return res;
    }
};

看了题解后写的递归法:

class Solution {
public:
    void traver(vector<vector<int>> &res, int depth, TreeNode* root) {
        if (!root) return;
        if (depth == res.size()) res.push_back(vector<int>());
        res[depth].push_back(root->val) ;
        traver(res, depth+1, root->left);
        traver(res, depth+1, root->right);
    }
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        int depth = 0;
        traver(res, depth, root);
        return res;
    }
};

看了题解后的收获

翻转二叉树

文章讲解:代码随想录
是否自己做出来通过全部用例:否

遇到的困难/犯的错误

思路是堆层序遍历的每一层的数据进行翻转,忽略了NULL的情况无法让指针去正确的位置。应该再上一层就进行下一层的翻转。

自己写的代码

看了题解后写的代码:
递归:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (!root) return;
        swap(root->left, root->right);
        invertTree(root->left);
        invertTree(root->right);
        return; 
    }
};

层序遍历:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        queue<TreeNode*> que;
        if (!root) return root;
        que.push(root);
        while (!que.empty()) {
            int size = que.size();
            while (size--) {
                TreeNode* node = que.front();
                que.pop();
                swap(node->left, node->right);
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }

        }
        return root;
    }
};

看了题解后的收获

翻转二叉树要在上一层对下一层进行翻转。

对称二叉树

文章讲解:代码随想录
是否自己做出来通过全部用例:是

遇到的困难/犯的错误

自己用了类似于层序遍历,对每层压入vector的元素进行两侧元素是否相等的判断,代码比较复杂,内存占用较多。

自己写的代码

自己写的:

class Solution {
public:
bool isSymmetric(TreeNode* root) {
queue<TreeNode*> que;
if (root == NULL) return true;
que.push(root);
while (!que.empty()) {
int size = que.size();
vector<TreeNode*> vc;
while (size–) {
TreeNode* node = que.front();
que.pop();
vc.push_back(node);
if (node) que.push(node->left);
if (node) que.push(node->right);
}
int left = 0;
int right = vc.size() - 1;
while (left <= right) {
if (vc[left] == NULL && vc[right] == NULL) {
left;
–right;
continue;
}
else if (vc[left] == NULL || vc[right] == NULL) return false;
else {
if (vc[left
]->val == vc[right–]->val) continue;
else {
return false;
}
}
}
}
return true;
}
};

迭代法:

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        queue<TreeNode*> que;
        if (root == NULL) return true;
        que.push(root->left);
        que.push(root->right);
        while (!que.empty()) {
            TreeNode* left = que.front();
            que.pop();
            TreeNode* right = que.front();
            que.pop();
            if (!left && !right) continue;
            if (!left || !right || left->val != right->val) return false;
            que.push(left->left);
            que.push(right->right);
            que.push(left->right);
            que.push(right->left);
        }
        return true;
    }
};

递归法:

class Solution {
public:
    bool compare(TreeNode* left, TreeNode* right) {
        if (!left && !right) return true;
        if (!left || !right) return false;
        if (left->val != right->val) return false;
        else return compare(left->left, right->right) && compare(left->right, right->left);
    }
    bool isSymmetric(TreeNode* root) {
        if (!root) return true;
        return compare(root->left, root->right);
    }
};

看了题解后的收获

既然是验证对称性,就将元素两两压入queue然后比较。