二叉树深度优先遍历统一迭代法
思路:把要处理的节点放入栈之后,紧接着放入一个空节点进行标记。
二叉树结构体定义:
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> result;
stack<TreeNode*> stk;
if (root != nullptr) {
stk.push(root);
}
while (!stk.empty()) {
TreeNode* node = stk.top();
if (node != nullptr) {
stk.pop();
if (node->right) { //右
stk.push(node->right);
}
if (node->left) { //左
stk.push(node->left);
}
stk.push(node); //中
stk.push(nullptr);
}
else{
stk.pop(); //弹出空节点
result.push_back(stk.top()->val);
stk.pop();
}
}
return result;
}
};
二叉树中序遍历:
class Solution { //二叉树的中序遍历 迭代 前中后序统一法
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> stk;
if (root != nullptr) {
stk.push(root);
}
while (!stk.empty()) {
TreeNode* node = stk.top();
if (node != nullptr) {
stk.pop();
if (node->right) { //右
stk.push(node->right);
}
stk.push(node); //中
stk.push(nullptr);
if (node->left) { //左
stk.push(node->left);
}
}
else{
stk.pop(); //弹出空节点
result.push_back(stk.top()->val);
stk.pop();
}
}
return result;
}
};
二叉树后序遍历:
class Solution { //二叉树的后序遍历 迭代 前中后序统一法
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> stk;
if (root != nullptr) {
stk.push(root);
}
while (!stk.empty()) {
TreeNode* node = stk.top();
if (node != nullptr) {
stk.pop();
stk.push(node); //中
stk.push(nullptr);
if (node->right) { //右
stk.push(node->right);
}
if (node->left) { //左
stk.push(node->left);
}
}
else{
stk.pop(); //弹出空节点
result.push_back(stk.top()->val);
stk.pop();
}
}
return result;
}
};
参考资料:代码随想录