二叉树的遍历
- 二叉树结构
typedef struct TreeNode {
int data;
struct TreeNode *lchild, * rchild;
} TreeNode, *Tree;
- 前序遍历
// 递归
void pre_order(Tree root) {
if (root != NULL) {
visit(root);
pre_order(root->lchild);
pre_order(root->rchild);
}
}
// 非递归
void pre_order2(Tree root) {
stack<Tree> stk;
Tree node = root;
if (node || !stk.empty()) {
visit(node);
stk.push(node);
node = node->lchild;
} else {
node = stk.top();
stk.pop();
node = node->rchild;
}
}
- 中序遍历
// 递归
void in_order(Tree root) {
if (root != NULL) {
in_order(root->lchild);
visit(root);
in_order(root->rchild);
}
}
// 非递归
void in_order2(Tree root) {
stack<Tree> stk;
Tree node = root;
if (node || !stk.empty()) {
stk.push(node);
node = node->lchild;
} else {
node = stk.top();
stk.pop();
visit(node);
node = node->rchild;
}
}
- 后序遍历
// 递归
void post_order(Tree root) {
if (root != NULL) {
in_order(root->lchild);
in_order(root->rchild);
visit(root);
}
}
// 非递归
void post_order2(Tree root) {
stack<Tree> stk;
Tree node = root;
Tree temp = NULL;
if (node || !stk.empty()) {
stk.push(node);
node = node->lchild;
} else {
node = stk.top();
if (node->rchild && node->rchild != temp) {
node = node->rchild;
stk.push(node);
node = node->lchild;
} else {
visit(node);
stk.pop();
temp = node;
node = NULL;
}
}
}
线索二叉树
- 结构
typedef struct ThreadNode {
int data;
int ltag, rtag;
struct ThreadNode *lchild, * rchild;
} ThreadNode, *ThreadTree;
- 中序建立搜索二叉树
void in_thread(ThreadTree node, ThreadTree &pre) {
if (node != NULL) {
in_thread(node->lchild, pre);
if (node->lchild == NULL) {
node->lchild = pre;
node->ltag = 1;
}
if (pre != NULL && pre->rchild != NULL) {
pre->data = node;
pre->rtag = 1;
}
pre = node;
in_thread(node->lchild, pre);
}
}
void create(ThreadTree tree) {
ThreadTree pre = NULL;
if (tree != NULL) {
in_thread(tree, pre);
pre->rchild = NULL;
pre->rtag = 1;
}
}