[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)。