leetcode94. 二叉树的中序遍历,递归法+迭代法。附带前序遍历方法
创始人
2024-12-28 20:37:02
0

leetcode94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
在这里插入图片描述
输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:
输入:root = []
输出:[]

示例 3:
输入:root = [1]
输出:[1]

一般思路:我们当初在学数据结构时的方法就是递归解决。先递归遍历左子树,然后递归访问根节点,最后递归遍历右子树。所谓中序、先序、后序的递归遍历只需要更改
res.push_back(node->val);
的位置即可。
完整代码如下:

class Solution { public:     void inorder(TreeNode* node,vector &res)     {         if(!node) return ;         inorder(node->left,res);         res.push_back(node->val);         inorder(node->right,res);         return ;     }     vector inorderTraversal(TreeNode* root) {     vector res;     if(root==NULL) return res;     inorder(root,res);     return res;     } }; 

我们可以将递归改写成迭代。
所谓迭代法,我们要使用到栈数据结构。具体来说,中序遍历就是把左子树的所有节点存入栈中,到底后再一个个弹出来,弹出来的过程中每弹出来一个,把根遍历后,把根的右子树也都存入栈中

class Solution { public:     vector inorderTraversal(TreeNode* root) {     stack stk;     vector res;     while(root!=nullptr || !stk.empty())     {         while(root!=nullptr)         {             stk.push(root);             root=root->left;         }         root=stk.top();         stk.pop();         res.push_back(root->val);         root=root->right;     }     return res;     } }; 

迭代法里比较难理解的是对右子树的处理,当左子树节点都被存入栈中之后,我们弹出一个节点,将其放入结果数组后,再处理当前节点的右节点(如果有的话),因为当前节点的右节点也可能存在左节点,如果有的话这些节点应该是在栈中其他节点之前被遍历的。

二叉树的前序遍历迭代法的逻辑也是这样,唯一区别每次节点入栈之前先遍历到结果数组里。

代码如下:

class Solution { public:     vector preorderTraversal(TreeNode* root) {         vector res;         if (root == nullptr) {             return res;         }          stack stk;         TreeNode* node = root;         while (!stk.empty() || node != nullptr) {             while (node != nullptr) {                 res.push_back(node->val);                 stk.push(node);                 node = node->left;             }             node = stk.top();             stk.pop();             node = node->right;         }         return res;     } };  

后序遍历迭代法相对将要难一些,我们之后再说。

相关内容

热门资讯

一分钟内幕!科乐吉林麻将系统发... 一分钟内幕!科乐吉林麻将系统发牌规律,福建大玩家确实真的是有挂,技巧教程(有挂ai代打);所有人都在...
一分钟揭秘!微扑克辅助软件(透... 一分钟揭秘!微扑克辅助软件(透视辅助)确实是有挂(2024已更新)(哔哩哔哩);1、用户打开应用后不...
五分钟发现!广东雀神麻雀怎么赢... 五分钟发现!广东雀神麻雀怎么赢,朋朋棋牌都是是真的有挂,高科技教程(有挂方法)1、广东雀神麻雀怎么赢...
每日必看!人皇大厅吗(透明挂)... 每日必看!人皇大厅吗(透明挂)好像存在有挂(2026已更新)(哔哩哔哩);人皇大厅吗辅助器中分为三种...
重大科普!新华棋牌有挂吗(透视... 重大科普!新华棋牌有挂吗(透视)一直是有挂(2021已更新)(哔哩哔哩)1、完成新华棋牌有挂吗的残局...
二分钟内幕!微信小程序途游辅助... 二分钟内幕!微信小程序途游辅助器,掌中乐游戏中心其实存在有挂,微扑克教程(有挂规律)二分钟内幕!微信...
科技揭秘!jj斗地主系统控牌吗... 科技揭秘!jj斗地主系统控牌吗(透视)本来真的是有挂(2025已更新)(哔哩哔哩)1、科技揭秘!jj...
1分钟普及!哈灵麻将攻略小,微... 1分钟普及!哈灵麻将攻略小,微信小程序十三张好像存在有挂,规律教程(有挂技巧)哈灵麻将攻略小是一种具...
9分钟教程!科乐麻将有挂吗,传... 9分钟教程!科乐麻将有挂吗,传送屋高防版辅助(总是存在有挂)1、完成传送屋高防版辅助透视辅助安装,帮...
每日必看教程!兴动游戏辅助器下... 每日必看教程!兴动游戏辅助器下载(辅助)真是真的有挂(2025已更新)(哔哩哔哩)1、打开软件启动之...