二叉树遍历
[Algo] 二叉树遍历
二叉树节点类型定义:
struct BinaryTreeNode
{
int val;
BinaryTreeNode *left;
BinaryTreeNode *right;
BinaryTreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
1. 前序遍历
// 1. 非递归前序遍历二叉树
// (1) 弹出栈顶 (2) 右孩子进栈 (3) 左孩子进栈
void preOrder(BinaryTreeNode *root)
{
stack<BinaryTreeNode *> s;
s.push(root);
while (!s.empty())
{
BinaryTreeNode *tmp = s.top();
s.pop();
cout << tmp->val << " ";
if (tmp->right != nullptr) s.push(tmp->right);
if (tmp->left != nullptr) s.push(tmp->left);
}
cout << endl;
}
2. 中序遍历
// 2. 非递归中序遍历二叉树
// (1) 左链进栈 (2) 弹出栈顶,右孩子进栈 (3) 栈非空或当前节点非空时循环
void inOrder(BinaryTreeNode *root)
{
stack<BinaryTreeNode *> s;
while (!s.empty() || root != nullptr)
{
if (root != nullptr)
{
s.push(root);
root = root->left;
}
else
{
BinaryTreeNode *tmp = s.top();
s.pop();
cout << tmp->val << " ";
root = tmp->right;
}
}
cout << endl;
}
3. 后序遍历
// 3. 非递归后序遍历二叉树(两个栈)
// (1) 前序方法交换左右孩子进栈顺序 (2) 弹出栈顶用另一个栈收集,最后依次出栈
void postOrder(BinaryTreeNode *root)
{
stack<BinaryTreeNode *> s;
stack<BinaryTreeNode *> collector;
s.push(root);
while (!s.empty())
{
BinaryTreeNode *tmp = s.top();
s.pop();
collector.push(tmp);
if (tmp->left != nullptr) s.push(tmp->left);
if (tmp->right != nullptr) s.push(tmp->right);
}
while (!collector.empty()) { cout << collector.top()->val << " "; collector.pop(); }
cout << endl;
}
时间复杂度均为O(n),空间复杂度除后序遍历为O(n)均为O(h)。