二叉树递归与迭代的区别
以此题为例,区别递归和迭代的区别
1.先序遍历
递归:
void preorderTra(TreeNode* root, vector<int>& nodes) {
if (root == nullptr) {
return;
}
node.push_back(root->val);
preorderTra(root->left, nodes);
preorderTra(root->right, nodes);
}
迭代:
void preorderTra(TreeNode* root, vector<int>& nodes) {
stack<TreeNode*> sta;
TreeNode* cur = root;
while (cur != nullptr || !sta.empty()) {
while (cur != nullptr) {
nodes.push_back(cur->val);
sta.push(cur);
cur = cur->left;
}
cur = sta.top();
sta.pop();
cur = cur->right;
}
}
2.中序遍历
递归:
void inorderTra(TreeNode* root, vector<int>& nodes) {
if (root == nullptr) {
return;
}
inorderTra(root->left, nodes);
node.push_back(root->val);
inorderTra(root->right, nodes);
}
迭代:
void inorderTra(TreeNode* root, vector<int>& nodes) {
stack<TreeNode*> sta;
TreeNode* cur = root;
while (cur != nullptr || !sta.empty()) {
while (cur != nullptr) {
sta.push(cur);
cur = cur->left;
}
cur = sta.top();
sta.pop();
nodes.push_back(cur->val);
cur = cur->right;
}
}
3.后序遍历
递归:
void postorderTra(TreeNode* root, vector<int>& nodes) {
if (root == nullptr) {
return;
}
postorderTra(root->left, nodes);
postorderTra(root->right, nodes);
node.push_back(root->val);
}
迭代:
void postorderTra(TreeNode* root, vector<int>& nodes) {
stack<TreeNode*> sta;
TreeNode* cur = root;
TreeNode* prev = nullptr;
while (cur != nullptr || !sta.empty()) {
while (cur != nullptr) {
sta.push(cur);
cur = cur->left;
}
cur = sta.top();
if (cur->right != nullptr && cur->right != prev) {
cur = cur->right;
}
else {
sta.pop();
nodes.push_back(cur->val);
prev = cur;
cur = nullptr;
}
}
}