二叉树前序中序后序遍历(非递归统一解法)
Posted chouxianyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树前序中序后序遍历(非递归统一解法)相关的知识,希望对你有一定的参考价值。
前言
昨天和今天复习了二叉树的前序遍历、中序遍历和后序遍历,找到了一种统一的非递归的方法(即使用一个思路非递归实现二叉树的前序、中序和后序遍历)。
思路
思路本质上还是递归,只不过不通过递归函数显式递归,而是通过栈模拟递归。
注意:
-
非空的树节点指针才能存入栈中
因为使用
nullptr
作为递归函数结束的标志,所以在栈中存储树节点指针时必须要检查是否非空。 -
遍历顺序和入栈顺序相反
前序遍历
LeetCode题目:https://www.cnblogs.com/chouxianyu/p/13290758.html
vector<int> preorderTraversal(TreeNode* root){
vector<int> result;
stack<TreeNode*> nodes;
if(root!=nullptr)
nodes.push(root);
while(!nodes.empty()){
// 取出节点
root = nodes.top();
nodes.pop();
// 将节点对应的树拆解成前序,模拟递归解法中的函数调用
if(root!=nullptr){
if(root->right!=nullptr)
nodes.push(root->right);
if(root->left!=nullptr)
nodes.push(root->left);
nodes.push(root);
nodes.push(nullptr); // 设置nullptr标志
}
// nullptr代表栈顶对应的树(根、左子树、右子树)已按照指定顺序遍历,一层递归函数运行结束
else{
result.push_back(nodes.top()->val);
nodes.pop();
}
}
return result;
}
中序遍历
LeetCode题目:https://www.cnblogs.com/chouxianyu/p/13293153.html
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> nodes;
if(root!=nullptr)
nodes.push(root);
while(!nodes.empty()){
root = nodes.top();
nodes.pop();
// 模拟调用递归函数
if(root!=nullptr){
if(root->right!=nullptr)
nodes.push(root->right);
nodes.push(root);
nodes.push(nullptr);
if(root->left!=nullptr)
nodes.push(root->left);
}
// 一层递归函数结束
else{
result.push_back(nodes.top()->val);
nodes.pop();
}
}
return result;
}
后序遍历
LeetCode题目:https://www.cnblogs.com/chouxianyu/p/13293152.html
vector<int> postorderTraversal(TreeNode* root){
vector<int> result;
stack<TreeNode*> nodes;
if(root!=nullptr)
nodes.push(root);
while(!nodes.empty()){
root = nodes.top();
nodes.pop();
// 模拟调用递归函数
if(root!=nullptr){
nodes.push(root);
nodes.push(nullptr);
if(root->right!=nullptr)
nodes.push(root->right);
if(root->left!=nullptr)
nodes.push(root->left);
}
// 递归函数调用成功
else{
result.push_back(nodes.top()->val);
nodes.pop();
}
}
return result;
}
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!
以上是关于二叉树前序中序后序遍历(非递归统一解法)的主要内容,如果未能解决你的问题,请参考以下文章