递归方式:
// 前序遍历
void PreorderTraversal(Node *root) {
if (root == NULL) {
// 空树
return;
}
printf("%d ", root->val); // 根
PreorderTraversal(root->left); // 前序遍历左子树
PreorderTraversal(root->right); // 前序遍历右子树
}
// 中序遍历
void InorderTraversal(Node *root) {
if (root == NULL) {
return;
}
InorderTraversal(root->left);
printf("%d ", root->val);
InorderTraversal(root->right);
}
// 后序遍历
void PostorderTraversal(Node *root) {
// 终止条件
if (root == NULL) {
return;
}
// 递推的过程
PostorderTraversal(root->left);
PostorderTraversal(root->right);
printf("%d ", root->val);
}
非递归:
#include <stack>
// 前序遍历非递归
void PreorderTraversalNoR(Node *root) {
stack<Node *> s; // 栈
Node *cur = root;
Node *top = NULL;
while (cur != NULL || !s.empty()) {
// 一路向左的过程
while (cur != NULL) {
printf("%c ", cur->val);
s.push(cur);
cur = cur->left;
}
// 一定是向左遇到 NULL
// 利用栈处理剩余的右子树
top = s.top(); s.pop();
//top = StackTop(&s); StackPop(&s);
cur = top->right;
}
}
void InorderTraversalNoR(Node *root) {
stack<Node *> s; // 栈
Node *cur = root;
Node *top = NULL;
while (cur != NULL || !s.empty()) {
// 一路向左的过程
while (cur != NULL) {
// 第一次遇到的结点的位置
s.push(cur);
cur = cur->left;
}
// 一定是向左遇到 NULL
// 利用栈处理剩余的右子树
top = s.top(); s.pop();
//top = StackTop(&s); StackPop(&s);
// 第二次遇到的地方
printf("%c ", top->val);
cur = top->right;
}
}
void PostorderTraversalNoR(Node *root) {
stack<Node *> s; // 栈
Node *cur = root;
Node *top = NULL;
Node *last = NULL;
while (cur != NULL || !s.empty()) {
// 一路向左的过程
while (cur != NULL) {
// 第一次遇到的结点的位置
s.push(cur);
cur = cur->left;
}
// 一定是向左遇到 NULL
// 利用栈处理剩余的右子树
top = s.top();
if (top->right == NULL) {
printf("%c ", top->val);
s.pop();
last = top;
}
else if (top->right == last) {
printf("%c ", top->val);
s.pop();
last = top;
}
else {
cur = top->right;
}
}
}