二叉树的定义
struct BiTreeNode {
int value;
struct BiTreeNode *left;
struct BiTreeNode *right;
};
先序遍历 (递归的形式)
void preOrderTraversal(struct BiTreeNode *node) {
if (node != NULL) {
printf("%d", node->value);
preOrderTraversal(node->left);
preOrderTraversal(node->right);
}
}
先序遍历 (非递归的形式)
void preOrderTraversalWithNonrecursively(struct BiTreeNode *T) {
std::stack<BiTreeNode *> s;
s.push(T);
while (!s.empty()) {
BiTreeNode *temp = s.top();
printf("%d", temp->value);
s.pop();
if (temp->right) {
s.push(temp->right);
}
if (temp->left) {
s.push(temp->left);
}
}
}
中序遍历 (非递归的形式)
#include <stack>
void InOrderTraversalWithNonrecursively(struct BiTreeNode *node) {
if (node == NULL) {
return;
}
std::stack<BiTreeNode *> s;
s.push(node);
struct BiTreeNode *current = node->left;
while (current != NULL || !s.empty()) {
while (current != NULL) {
s.push(current);
current = current->left;
}
current = s.top();
s.pop();
printf("%d", current->value);
current = current->right;
}
}
二叉树翻转
struct BiTreeNode * reverseBiTree(struct BiTreeNode *node) {
if (node == NULL) {
return node;
}
struct BiTreeNode *n = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
n->value = node->value;
if (node->left != NULL) {
node->right = reverseBiTree(node->left);
} else {
node->right = NULL;
}
if (node->right) {
node->left = reverseBiTree(node->right);
} else {
node->left = NULL;
}
return n;
}
完整的代码
#include <stack>
struct BiTreeNode {
int value;
struct BiTreeNode *left;
struct BiTreeNode *right;
};
void preOrderTraversal(struct BiTreeNode *node) {
if (node != NULL) {
printf("%d", node->value);
preOrderTraversal(node->left);
preOrderTraversal(node->right);
}
}
void preOrderTraversalWithNonrecursively(struct BiTreeNode *T) {
std::stack<BiTreeNode *> s;
s.push(T);
while (!s.empty()) {
BiTreeNode *temp = s.top();
printf("%d", temp->value);
s.pop();
if (temp->right) {
s.push(temp->right);
}
if (temp->left) {
s.push(temp->left);
}
}
}
void InOrderTraversalWithNonrecursively(struct BiTreeNode *node) {
if (node == NULL) {
return;
}
std::stack<BiTreeNode *> s;
s.push(node);
struct BiTreeNode *current = node->left;
while (current != NULL || !s.empty()) {
while (current != NULL) {
s.push(current);
current = current->left;
}
current = s.top();
s.pop();
printf("%d", current->value);
current = current->right;
}
}
struct BiTreeNode * reverseBiTree(struct BiTreeNode *node) {
if (node == NULL) {
return node;
}
struct BiTreeNode *n = (struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
n->value = node->value;
if (node->left != NULL) {
node->right = reverseBiTree(node->left);
} else {
node->right = NULL;
}
if (node->right) {
node->left = reverseBiTree(node->right);
} else {
node->left = NULL;
}
return n;
}