首页 > 编程语言 >代码随想录算法训练营第十四天 | 二叉树遍历

代码随想录算法训练营第十四天 | 二叉树遍历

时间:2024-05-22 12:30:31浏览次数:17  
标签:node 随想录 st 第十四天 vector 二叉树 ans push root

递归法

文章讲解 视频讲解
递归三要素:
1 确定递归函数的参数和返回值
2 确定终止条件
3 确定单层递归的逻辑

前序遍历

题目链接

  1. 递归的参数和返回值:传入当前节点和保存结果集的数组,不需要返回值
  2. 终止条件:当前节点为空时
  3. 单层递归逻辑:保存当前节点的值到结果集中
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ans;
        traversal(root, ans);
        return ans;
    }
    void traversal(TreeNode* node, vector<int>& ans) {
        if(node == nullptr) return ;
        ans.push_back(node->val);  // 根
        traversal(node->left, ans);  // 左
        traversal(node->right, ans);  // 右
    }
};

中序遍历

题目链接

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        traversal(root, ans);
        return ans;
    }
    void traversal(TreeNode* node, vector<int>& ans){
        if(node == nullptr) return ;
        traversal(node->left, ans);  // 左
        ans.push_back(node->val);  // 根
        traversal(node->right, ans);  // 右
    }
};

后序遍历

题目链接

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> ans;
        traversal(root, ans);
        return ans;
    }
    void traversal(TreeNode* node, vector<int>& ans) {
        if(node == nullptr) return ;
        traversal(node->left, ans);  // 左
        traversal(node->right, ans);  // 右
        ans.push_back(node->val);  // 根
    }
};

迭代法

文章讲解

思路:递归遍历就是将当前结果保存在栈中,等到返回的时候再从栈顶弹出保存的结果,所以可以用栈来模拟递归的方式来实现堆二叉树的遍历

前序遍历

视频讲解

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ans;
        stack<TreeNode*> st;
        if(root == nullptr) return {};
        st.push(root);
        while(!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            // 需调整入栈顺序来保证出栈顺序为根左右
            if(node == nullptr) continue;
            ans.push_back(node->val);  // 根
            st.push(node->right);  // 右
            st.push(node->left);  // 左
        }
        return ans;
    }
};

中序遍历

视频讲解

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

后序遍历

视频讲解

思路:直接用栈来调整是很难满足后续遍历要求的会陷入复杂的逻辑判断中;
这是可以观察前序遍历是根->左->右, 而后序遍历是左->右->根,秩序调前序遍历代码的入栈顺序为先左后右,就可以得到:
根->右->左的顺序,最后将数组反转就可以得到正确的顺序

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


        return ans;
    }
};

标签:node,随想录,st,第十四天,vector,二叉树,ans,push,root
From: https://www.cnblogs.com/cscpp/p/18205025

相关文章

  • 代码随想录算法训练营第第14天 | 二叉树递归遍历(递归法、迭代、统一的迭代方法)
    递归遍历(必须掌握)二叉树的三种递归遍历掌握其规律后,其实很简单题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的递归遍历.html迭代遍历(基础不好的录友,迭代法可以放过)题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的迭代遍历.html统一迭代......
  • 代码随想录算法训练营第十三天 | 239. 滑动窗口最大值 347. 前k个高频元素
    239.滑动窗口最大值题目链接文章讲解视频讲解思路:使用单调队列,来维护有可能成为最大值的元素;   当窗口向右滑动时,判断移除的元素是否是队首元素如果是的话出队;   新加入的元素依次和队尾元素作比较,如果大于队尾元素则将队尾元素循环出队,这样可以保证队列中始终维持......
  • 二叉树 | 递归法 101.对称二叉树
    leetcode101.对称二叉树题目101.对称二叉树给你一个二叉树的根节点root,检查它是否轴对称。解题思路递归法,判断左节点的左孩子是否可以翻转成右节点的右孩子(左节点的左孩子==右节点的右孩子,左节点的右孩子==右节点的左孩子)递归三步骤:1、确定递归函数的入参和返回值......
  • 二叉树 | 迭代法 102.二叉树的层序遍历 429. N 叉树的层序遍历 226.翻转二叉树
    leetcode102.二叉树的层序遍历题目102.二叉树的层序遍历给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。解题思路实现代码classTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valse......
  • 二叉树的递归遍历 144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历
    leetcode144.二叉树的前序遍历题目xxx解题思路实现代码leetcode145.二叉树的后序遍历题目xxx解题思路实现代码leetcode94.二叉树的中序遍历题目xxx解题思路实现代码......
  • 代码随想录算法训练营第十一天 | 20.有效的括号 1047.删除字符串中的所有相邻 重复项
    20.有效的括号题目链接文章讲解视频讲解思路:遍历字符串,如果栈不为空,则进行匹配   如果匹配则出栈,否则入栈   如果栈为空,直接入栈   遍历结束后栈为空则说明全部匹配,否则没有全部匹配classSolution{public:boolisValid(strings){stack<cha......
  • 代码随想录算法训练营第第11天 | 20. 有效的括号 、1047. 删除字符串中的所有相邻重
    今天的题主要是关于栈的,比较简单,一次性过20.有效的括号讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。大家先自己思考一下有哪些不匹配的场景,在看视频我讲的都有哪些场景,落实到代码其实就容易很多了。题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.......
  • algo 完全二叉树
    性质1:左子树的深度等于右子树---左为满,右为完全左子树的深度大于右子树---左为完全,右为满一个完全二叉树的左右子树都是完全二叉树不断递归之后---最后都是满二叉树---只剩一个节点性质2:可以和位运算进行结合https://leetcode.cn/problems/count-complete-tre......
  • DataStruct 二叉树
    二叉树的分类满二叉树:节点数量:$2^k-1$完全二叉树:应用:heap二叉搜索树规则:左不空,则左右节点都小于根节点右不空,则右变的节点都大于根节点左右子树都是二叉搜做树平衡二叉搜索树AVL(Adelson-VelskyandLandis)树左右子树的高度差的绝对值小于1应用:......
  • 代码随想录算法训练营第第九天 | 28. 实现 strStr() 、459.重复的子字符串
    实现strStr()因为KMP算法很难,大家别奢求一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会好懂很多。或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。因为大家算法能力还没到,......