二叉树的遍历(非递归)
二叉树的遍历
1.前序遍历
先访问根节点,再访问左子树,最后访问右子树。
算法思想:从根到
1 void pre_order(struct ptree_node *root)
2 {
3 struct ptree_node *stack[MAX_SIZE], *p = root;
4 int top = 0;
5 while (NULL != p || top > 0) {
6 if (NULL != p) {
7 visit(p);
8 stack[top++] = p;
9 p = p->left;
10 } else {
11 p = stack[top--];
12 p = p->rigth;
13 }
14 }
15 }
2.中序遍历
先访问左子树,再访问根节点,最后访问右子树
1 void in_order(struct btree_node *root)
2 {
3 struct btree_node *stack[MAX_SIZE], *p = root;
4 int top = 0;
5 while (NULL != p || top > 0) {
6 if (NULL != p) {
7 stack[top++] = p;
8 p = p->left;
9 } else {
10 p = stack[top--];
11 visit(p);
12 p = p->right;
13 }
14 }
15 }
3.后续遍历
先访问左子树,然后访问右子树,最后访问根节点
1 void post_order(struct btree_node *root)
2 {
3 struct btree_node *stack[MAX_SIZE], *p = root;
4 int top = 0;
5 while (NULL != p || top > 0) {
6 while (p!= NULL) {
7 stack[top++] = p;
8 p = p->left;
9 }
10 if (top > 0) {
11 p = stack[top];
12 if (root->flag) {
13 visit(p);
14 top--;
15 p = NULL;
16 } else {
17 p->flag = true;
18 p = p->right;
19 }
20 }
21 }
22 }
4.层次遍历
逐层遍历二叉树
1 void level_tranv(struct btree_node *root)
2 {
3 struct btree_node *queue[MAX_SIZE], *p = root;
4 inqueue(p);
5 while (!is_empty(queue)) {
6 p = dequeue(queue);
7 visit(p);
8 if (NULL != p->lchild) {
9 inqueue(queue);
10 }
11 if (NULL != p->rchild) {
12 inqueue(queue);
13 }
14 }
15 }
浙公网安备 33010602011771号