2025.1.24学习记录1

一,代码随想录二叉树基础知识

看了一遍感觉没有啥特别难的地方,就是一些基础的内容,要熟练掌握。

二,代码随想录二叉树递归遍历

二叉树的递归遍历整体代码比较简洁,前中后序就是中间三行的代码顺序交换了一下。 

class Solution {
public:
    void Traversal(TreeNode* root,vector<int>& result){
        if(root==NULL)return;
        result.push_back(root->val);
        Traversal(root->left,result);
        Traversal(root->right,result);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        Traversal(root,result);
        return result;
    }
};

 三,代码随想录二叉树的迭代遍历

二叉树的前序遍历:首先先定义一个栈,数据类型为treenode*,再定义一个整型数组result,用于返回结果。如果根为空则直接返回root,否则就将root压栈进入栈中。接着用while循环遍历二叉树,循环的条件为二叉树始终不为空。先获取栈顶元素,再让栈顶元素出栈。再让此时栈顶元素的数值进入result数组,然后再分别让右,左元素进入栈中即可,注意顺序是右左而不是左右,因为栈后进先出的性质,入栈顺序是右左则进行出栈处理的时候处理顺序即为左右。 

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> s;
        vector<int> result;
        if(!root)return result;
        s.push(root);
        while(!s.empty()){
            TreeNode* t=s.top();
            s.pop();
            result.push_back(t->val);
            if(t->right)s.push(t->right);
            if(t->left)s.push(t->left);
        }
        return result;
    }
};

二叉树的后序遍历:大致思路和前序遍历差不多。前序遍历是根左右,后序遍历为左右根,思路如下:前序遍历是先处理根,再让右孩子进栈,再让左孩子进栈。后序遍历先调整左右孩子进展顺序,最终得到的结果是根右左,再使用reverse数组让整个结果反转为左右根即为正确答案。

 

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> s;
        vector<int> result;
        if(!root)return result;
        s.push(root);
        while(!s.empty()){
            TreeNode* t=s.top();
            s.pop();
            result.push_back(t->val);
            if(t->left)s.push(t->left);
            if(t->right)s.push(t->right);
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

二叉树的中序遍历:此时不能再和中序遍历一样简单修改几行代码,因为前序遍历和后序遍历的遍历顺序和处理顺序是同步的,但是中序遍历的遍历顺序和处理顺序是不同步的因此要重新设计。大致思路:首先先定义一个整型数组result,一个TreeNode*类型的栈,再定义一个指针cur,让cur等于root。用while循环遍历数组,循环条件是栈不为空或者cur不指向空。假如cur不指向null,就让cur指向的元素入栈,cur继续往左边走,假如指向空了,说明走到最左边了,这个时候就应该对cur指向的上一个元素进行操作,也就是栈顶元素。让栈顶元素等于cur,再让栈顶元素出栈,cur指向的数值进入result数组,此时左根右中完成了左和根,再让cur往右走,以此循环。

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> s;
        TreeNode* cur;
        cur=root;
        while(cur!=NULL||s.empty()==false){
            if(cur!=NULL){
                s.push(cur);
                cur=cur->left;
            }
            else{
                cur=s.top();
                s.pop();
                result.push_back(cur->val);
                cur=cur->right;
            }
        }
        return result;
    }
};

四,代码随想录二叉树层序遍历

 思路:定义一个二维数组result来返回,然后定义一个队列q用于层序遍历的过程进行数据的处理。用while循环进行层序遍历。循环条件为q不为空队列。先用一个变量size记录此时队列长度(不能直接用q.size()函数因为后面的for循环长度一直在变化),然后建立一个vec整型数组储存当前这一层的结果。然后用for循环遍历这一层。这一轮循环结束后vec数组进入result数组中,while循环结束即为遍历结束。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值