标签:blog 非递归 bin 实现 int pop 结束 成功 指定
昨天和今天复习了二叉树的前序遍历、中序遍历和后序遍历,找到了一种统一的非递归的方法(即使用一个思路非递归实现二叉树的前序、中序和后序遍历)。
思路本质上还是递归,只不过不通过递归函数显式递归,而是通过栈模拟递归。
注意:
非空的树节点指针才能存入栈中
因为使用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/
欢迎讨论和交流!
标签:blog 非递归 bin 实现 int pop 结束 成功 指定
原文地址:https://www.cnblogs.com/chouxianyu/p/13293284.html