笔记:广度优先遍历
层序遍历
实现一个链队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| typedef struct QNode { TreeNode *e; struct QNode *next; } QNode;
typedef struct Quece { QNode *f, *r; int Qsize; } Quece;
bool InitQ(Quece **q, int size) { *q = (Quece *)malloc(sizeof(Quece)); (*q)->f = (*q)->r = (QNode *)malloc(sizeof(QNode)); (*q)->f->next = NULL; return 1; }
bool isE(Quece *q) { return q->f == q->r; }
bool EnQ(Quece *q, TreeNode *x) { QNode *new_qnode = (QNode *)malloc(sizeof(QNode)); new_qnode->e = x; new_qnode->next = NULL; q->r->next = new_qnode; q->r = new_qnode; printf("[+]EnQ: %d\n", x->id); return 1; }
TreeNode *DeQ(Quece *q) { TreeNode *rec; if (q->f == q->r) { return NULL; } QNode *p = q->f->next; rec = p->e; q->f->next = p->next; if (q->r == p) q->r = q->f; free(p);
printf("[-]DnQ: %d\n", rec->id); return rec; }
|
定义访问行为
1 2 3 4 5
| bool visit_1(TreeNode *any_node) { printf("%d ved\n", any_node->id); }
|
层序遍历算法
大体上就是从树根结点开始不停进行入队--出队+访问操作.
- 入队操作规则: 根结点以外的任何结点的入队,
都是它的双亲结点的出队所导致的.
- 出队操作规则: 出队之后先访问它.
再把按照左孩子--右孩子的顺序把它的两个孩子放进队列.
流程如下:
- 初始化链式队列, 初始化树一颗.
- 根结点入队.
- 根结点点出队&&访问根结点.
- 根结点的孩子按照规则入队&&出队.
- 重复4直到队空.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
void levelOrderTR(TreeNode *root) { Quece *q; TreeNode *p; InitQ(&q, 20); EnQ(q, root); while (!isE(q)) { p = DeQ(q); visit_1(p); if (p->l) EnQ(q, p->l); if (p->r) EnQ(q, p->r); } }
|