二叉树遍历
二叉树遍历最简单的就是递归了。因为递归实质上是栈存了一些中间值,所以我们可以使用stack实现迭代版的遍历。
- 中序遍历
步骤:
首先将root节点作为当前节点。
1.如果当前节点不为空,压入当前节点。将左节点作为当前节点。
2.否则弹出栈顶节点作为当前节点,输出当前节点。
3.如果右节点不为空,右节点作为当前节点。
4.否则将当前节点置为空。
重复1、2、3、4直到栈为空。
void InorderTraversal(TreeNode *root){ if(!root)return; TreeNode *node=root; stack<TreeNode*> mystk; while(node||mystk.size()){ while(node){ mystk.push(node); node=node->left; } node=mystk.top(); mystk.pop(); cout<<node->val<<'\t'; if(node->right){ node=node->right; }else{ node=NULL; } } }
- 前序遍历
前序遍历和中序遍历差不多,只是输出节点值的时机不同。
步骤:
以root节点作为当前节点
1.如果当前节点不为空,将当前节点压入栈,同时输出当前节点。并将左节点作为当前节点。
2.否则弹出栈顶作为当前节点。
3.如果右节点不为空,将右节点作为当前节点。
4.否则将当前节点置为空。
重复1、2、3、4直到栈为空。
void PreorderTraversal(TreeNode *root){ if(!root)return; TreeNode *node=root; stack<TreeNode*> mystk; while(node||mystk.size()){ while(node){ mystk.push(node); cout<<node->val<<'\t'; node=node->left; } node=mystk.top(); mystk.pop(); if(node->right){ node=node->right; }else{ node=NULL; } } }
- 后序遍历
后序遍历有点特殊,需要一个辅助节点记录是否遍历过了。
步骤:
将root节点作为当前节点
1.如果当前节点不为空,将当前节点压入栈中。将左节点作为当前节点。
2.否则,将栈顶节点(不弹出)作为当前节点。
3.如果右节点不为空且右节点不等于pre节点,将右节点作为当前节点。
4.否则,输出当前节点,pop栈顶,并将当前节点作为pre节点。设置当前节点为空。
重复1、2、3、4直到栈为空。
void PostorderTraversal(TreeNode *root){ if(!root)return; TreeNode *node=root; TreeNode *pre=NULL; stack<TreeNode*> mystk; while(node||mystk.size()){ while(node){ mystk.push(node); node=node->left; } node=mystk.top(); if(node->right&&node->right!=pre){ node=node->right; }else{ cout<<node->val<<'\t'; mystk.pop(); pre=node; node=NULL; } } }
上述三种遍历对于每个节点都是入栈一次出栈一次,所以时间复杂度和空间复杂度都是o(n)。
而Morris遍历则可以o(1)完成各种遍历。下面解释morris遍历。
- Morris遍历
morris遍历的精髓是提出了前驱节点的概念:即输出前驱节点后,下一个输出的就是当前节点。
参考http://blog.csdn.net/zhaoyunfullmetal/article/details/48087663
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析
· 上周热点回顾(3.24-3.30)