首页 > 其他分享 >LeetCode刷题记录.Day30

LeetCode刷题记录.Day30

时间:2022-12-03 21:24:39浏览次数:72  
标签:node cur Day30 st vector result root LeetCode 刷题

二叉树的前序遍历

递归遍历法

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& result){
        if(cur == NULL) return; //当前节点为空,终止递归过程
        result.push_back(cur->val); //存储当前节点值
        traversal(cur->left,result); //前序遍历,中左右,先递归左孩子节点
        traversal(cur->right,result);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

迭代法

 

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root); //根节点入栈
        while(!st.empty()){
            TreeNode* node = st.top();//node为此时的栈顶,因为先入栈的是右节点,后入栈的左结点,所以top为左结点,遵循中左右
            st.pop();
            result.push_back(node->val); //前序中左右,中结点值入栈
            if(node->right) st.push(node->right);//右,因为栈输出倒序,右结点值入栈
            if(node->left) st.push(node->left);//左
        }
        return result;
    }
};

具体思想写在备注。主要理解二叉树遍历顺序和迭代,递归条件的关系

二叉树的后序遍历

递归遍历法

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& result){
        if(cur == NULL) return; //当前节点为空,终止递归过程
        traversal(cur->left,result); //左 前序遍历,中左右,先递归左孩子节点
        traversal(cur->right,result); //右
        result.push_back(cur->val); //中 存储当前节点值,当前顺序为中
    }
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

迭代法

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root);
        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();
            result.push_back(node->val); //中值先入result
            if (node->left) st.push(node->left); // 相对于前序遍历,这更改一下入栈顺序 
            if (node->right) st.push(node->right); // 空节点不入栈
            //现在栈中顺序为 中 右 左
        }
        reverse(result.begin(), result.end()); //反转顺序变为 左 右 中
        return result;
    }
};

 

二叉树的中序遍历

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& result){
        if(cur == NULL) return; //当前节点为空,终止递归过程
        traversal(cur->left,result); //左 前序遍历,中左右,先递归左孩子节点
        result.push_back(cur->val); //中 存储当前节点值,当前顺序为中
        traversal(cur->right,result); //右
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

迭代法

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> 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 result;
    }
};

 

标签:node,cur,Day30,st,vector,result,root,LeetCode,刷题
From: https://www.cnblogs.com/tianmaster/p/16948635.html

相关文章

  • Day30:ArrayList详解
    ArrayList1.1集合概述当我们要存储多个数据时,固定长度的数组存储格式已经满足不了我们的需要了,且不能满足变化的需求;Java中集合类则可以解决我们的需求特点:提供一种存......
  • #yyds干货盘点# LeetCode程序员面试金典:旋转矩阵
    题目:给你一幅由N×N矩阵表示的图像,其中每个像素的大小为4字节。请你设计一种算法,将图像旋转90度。不占用额外内存空间能否做到? 示例1:给定matrix=[ [1,2,3],......
  • day30-JQuery03
    JQuery034.jQuery选择器034.4表单选择器应用实例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>表单选择器应用实例</title>......
  • 力扣 leetcode 438. 找到字符串中所有字母异位词
    问题描述给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字......
  • LeetCode刷题笔记
    前言:我是从大四上学期开始刷算法题的,那时候比较迷茫,不知道做什么。想着提升一下自己,就看着B站代码随想录的视频,然后开始在力扣上刷题。当你陷入迷茫,不知道学什么的时候,只要......
  • 力扣 leetcode 11. 盛最多水的容器
    问题描述给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容......
  • leetcode.cn 10.正则表达式匹配 记忆化搜索
    心血来潮想刷刷题玩,想起leetcode,注册登录,知道leetcode上的题都比较简单,就勾选难度为“困难”,然后看到此题。读完题,心想这标为“困难”,该不会是得用DFA甚至NFA吧?又仔细看......
  • 力扣 leetcode 986. 区间列表的交集
    问题描述给定两个由一些闭区间组成的列表,firstList和secondList,其中firstList[i]=[starti,endi]而secondList[j]=[startj,endj]。每个区间列表都是成对不......
  • 力扣 leetcode 1769. 移动所有球到每个盒子所需的最小操作数
    问题描述有n个盒子。给你一个长度为n的二进制字符串boxes,其中boxes[i]的值为'0'表示第i个盒子是空的,而boxes[i]的值为'1'表示盒子里有一个小球。在......
  • #yyds干货盘点# LeetCode程序员面试金典:字符串压缩
    题目:字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串......