非递归栈1:采用左右子节点入栈
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution
{
public:
vector<int> preorderTraversal(TreeNode *root)
{
stack<TreeNode *> s;
vector<int> v;
s.push(root);
TreeNode *cur;
while(!s.empty())
{
cur=s.top();
s.pop();
if(cur!=nullptr)
{
v.push_back(cur->val);
s.push(cur->right);
s.push(cur->left);
}
}
return v;
}
};
非递归栈2:采用右子节点入栈,左子节点迭代
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution
{
public:
vector<int> preorderTraversal(TreeNode *root)
{
stack<TreeNode *> s;
vector<int> v;
TreeNode *cur=root;
while(true)
{
if(cur!=nullptr)
{
v.push_back(cur->val);
s.push(cur->right);
cur=cur->left;
}
else if(s.empty())
break;
else
{
cur=s.top();
s.pop();
}
}
return v;
}
};
非递归3:线索二叉树遍历:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution
{
public:
vector<int> preorderTraversal(TreeNode *root)
{
vector<int> v;
if (root == nullptr)
return v;
TreeNode *cur = root;
TreeNode *pre = nullptr;
while (cur != nullptr)
{
if (cur->left == nullptr)
{
v.push_back(cur->val);
cur = cur->right;
continue;
}
pre = cur->left;
while (pre->right != nullptr && pre->right != cur)
{
pre = pre->right;
}
if (pre->right == nullptr)
{
v.push_back(cur->val);
pre->right = cur;
cur = cur->left;
}
else
{
pre->right = nullptr;
cur = cur->right;
}
}
return v;
}
};