代码随想录算法训练营第十四天 [递归遍历 迭代遍历 统一迭代]
一、递归遍历
链接: 代码随想录.
思路:递归
做题状态:看解析后做出来了
//前序遍历
class Solution
{
public:
void traversal(TreeNode *root, vector<int> &result)
{
if (root == nullptr)
{
return;
}
result.push_back(root->val);
traversal(root->left, result);
traversal(root->right, result);
};
vector<int> preorderTraversal(TreeNode *root)
{
vector<int> result;
traversal(root, result);
return result;
}
};
//中序遍历
class Solution
{
public:
void traversal(TreeNode *root, vector<int> &result)
{
if (root == nullptr)
{
return;
}
traversal(root->left, result);
result.push_back(root->val);
traversal(root->right, result);
}
vector<int> inorderTraversal(TreeNode *root)
{
vector<int> result;
traversal(root, result);
return result;
}
};
//后续遍历
class Solution
{
public:
void traversal(TreeNode *root, vector<int> &result)
{
if (root == nullptr)
{
return;
}
traversal(root->left, result);
traversal(root->right, result);
result.push_back(root->val);
}
vector<int> postorderTraversal(TreeNode *root)
{
vector<int> result;
traversal(root, result);
return result;
}
};
二、迭代遍历
链接: 代码随想录.
思路:使用二分法
做题状态:看解析后做出来了
//前序遍历
class Solution
{
public:
vector<int> preorderTraversal(TreeNode *root)
{
stack<TreeNode *> st;
vector<int> result;
// TreeNode *cur = root;
if (root == nullptr)
{
return result;
}
st.push(root);
while (!st.empty())
{
TreeNode *node = st.top();
st.pop();
result.push_back(node->val);
// 前序遍历 中左右
// 栈是先进后出的,结果需要先输出左子节点,所以栈要先加入右子节点
if (node->right)
st.push(node->right);
if (node->left)
st.push(node->left);
}
return result;
}
};
//中序遍历
// 迭代法
class Solution
{
public:
vector<int> inorderTraversal(TreeNode *root)
{
// 中序遍历 左中右
// 画图理解
stack<TreeNode *> st;
vector<int> result;
TreeNode *cur = root;
while (cur != nullptr || !st.empty())
{
if (cur != nullptr)
{
st.push(cur);
cur = cur->left;
}
else
{
cur = st.top();
st.pop();
result.push_back(cur->val);
cur = cur->right;
}
}
return result;
}
};
//后续遍历
class Solution
{
public:
vector<int> postorderTraversal(TreeNode *root)
{
stack<TreeNode *> st;
vector<int> result;
if (root == nullptr)
{
return result;
}
st.push(root);
while (!st.empty())
{
TreeNode *node = st.top();
st.pop();
result.push_back(node->val);
// 后序遍历 左右中 === 前序遍历中左右->左右交换中右左 ->反转数组变成左右中
// 栈是先进后出的,结果需要先输出右子节点,所以栈要先加入左子节点
if (node->left)
st.push(node->left);
if (node->right)
st.push(node->right);
}
reverse(result.begin(), result.end());
return result;
}
};
三、统一迭代
链接: 代码随想录.
思路:加入空节点做标记
做题状态:还没掌握
// 还没理解,理解了再补上