代码随想录算法训练营第15天 |第六章 二叉树 part02

学习目标:

  • 102. 层序遍历
  • 226.翻转二叉树
  • 101.对称二叉树

学习内容:

102. 层序遍历

//方法1,队列先进先出
class Solution
{
public:
    vector<vector<int>> levelOrder(TreeNode *root)
    {
        // 先定义返回结果的
        vector<vector<int>> result;

        queue<TreeNode *> que;
        if (root != nullptr)
            que.push(root); // 先把根节点塞进去,从第一层开始
        while (!que.empty())
        {
            int size = que.size(); // 获取同一层总共有多少个节点,比如第一层就只有一个节点
            vector<int> vec;       // 这是存放每一层节点的vector
            for (int i = 0; i < size; i++)
            {

                TreeNode *node = que.front();
                vec.push_back(node->val);
                que.pop();
                if (node->left)
                    que.push(node->left);
                if (node->right)
                    que.push(node->right);
            }
            // 同一层的循环结束
            result.push_back(vec);
        }
        return result;
    }
};
// 方法2,递归法,依照深度为变量。
class Solution
{
public:
    void Order(TreeNode *node, vector<vector<int>> &result, int depth)
    {
        if (node == nullptr)
            return;
        if (result.size() == depth)
            result.push_back(vector<int>()); // 开始新的一层的时候先加一个vector,用来存放这一层的节点
        result[depth].push_back(node->val);
        Order(node->left, result, depth + 1);
        Order(node->right, result, depth + 1);
    }
    vector<vector<int>> levelOrder(TreeNode *root)
    {
        vector<vector<int>> result;
        int depth = 0;
        TreeNode *cur = root;
        Order(cur, result, depth);
        return result;
    }
};

错误以及注意事项

  • push_back 主要用于顺序容器,如 vector、deque(双端队列) 等,而 push 则通常与栈(stack)和队列(queue)相关。
容器添加元素
vectorpush_back()
stackpush()
queuepush()
dequepush_back() , push_front()

226.翻转二叉树

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        //确定终止条件
        if(root==nullptr) return root; 
        // 确定单层递归的逻辑
        swap(root->left,root->right);
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};
// 用栈迭代!
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root==nullptr) return root;
        stack<TreeNode*> st;
        st.push(root);
        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();
            swap(node->right,node->left);
            if(node->left) st.push(node->left);
            if(node->right) st.push(node->right);
        }
        return root;
    }
};

错误以及注意事项

  • 两个写法都不是很熟练,统一写法没看。
//与前序遍历对比代码
class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& vec) {
        if (cur == NULL) return;
        vec.push_back(cur->val);    // 中
        traversal(cur->left, vec);  // 左
        traversal(cur->right, vec); // 右
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

学习时间:

2023.12.14 18:00-20:54
眼睛太痛了,明天再看最后一题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值