集训第七天
2016-07-12 22:32
211 查看
今天讲了图和DFS,对于图和昨天的线段树,我看的是一脸的迷茫,那么就写写DFS遍历二叉树的实现。 对于DFS利用栈来实现,首先是将二叉树的根节点压栈,循环的结束条件是栈为空,然后在循环的内部,先输出栈顶元素,用临时变量储存栈顶的元素,栈顶元素弹出后,压栈临时值保存的值的右子树和左子树(利用栈先进后出的性质),下次循环的时候,将上一次的左子树输出弹出,并将该左子树的右子树和左子树压栈,以此类推,直到栈为空,循环结束。 其中我在设计树的结点和栈结点的时候,将两者融合到了一块,因为栈并不需要数值域。 代码如下(没有借助STL标准库模板): # include <stdio.h> # include <stdlib.h> # include <malloc.h> struct NODE //树的结点和栈的结点合并 { char data; struct NODE *lchild; struct NODE *rchild; struct NODE *next; }; struct POINT //指向栈顶和栈底的结构体 { struct NODE *top; struct NODE *bottom; }; struct NODE *BuildTree(void); struct POINT *InitStack(void); void Push(struct POINT *p, struct NODE *q); void Pop(struct POINT *p); bool Empty(struct POINT *p); void DFS(struct NODE *root); int main() { struct NODE *root = BuildTree(); DFS(root); return 0; } struct NODE *BuildTree(void) //先序顺序输入 { char val; struct NODE *root = NULL; scanf("%c", &val); if (' ' == val) { return NULL; } else { root = (struct NODE *)malloc(sizeof(struct NODE)); if (NULL == root) { printf("内存申请失败!\n"); exit(-1); } root->data = val; root->lchild = BuildTree(); root->rchild = BuildTree(); return root; } } struct POINT *InitStack(void) { struct NODE *q = (struct NODE *)malloc(sizeof(struct NODE)); if (NULL == q) { printf("申请内存失败!\n"); exit(-1); } struct POINT *point = (struct POINT *)malloc(sizeof(struct POINT)); if (NULL == point) { printf("申请内存失败!\n"); exit(-1); } point->bottom = q; point->top = q; q->next = NULL; return point; } void Push(struct POINT *p, struct NODE *q) //第一个参数是栈 第二个参数是要压栈的元素 { q->next = p->top; p->top = q; } void Pop(struct POINT *p) { struct NODE *temp = p->top; p->top = temp->next; free(temp); } bool Empty(struct POINT *p) { if (p->top == p->bottom) return true; else return false; } void DFS(struct NODE *root) { struct POINT *stack = InitStack(); struct NODE *temp; Push(stack, root); while ( !Empty(stack) ) { temp = stack->top; printf("%c ", temp->data); Pop(stack); if ( temp->rchild ) { Push(stack, temp->rchild); } if ( temp->lchild ) { Push(stack, temp->lchild); } } }
相关文章推荐
- TOJ 1188.Tian Ji -- The Horse Racing
- JQ语法
- WAS SystemOut.log SECJ0384E com.ibm.ws.security.web.TAMTrustAssociationInterceptorPlus -1
- Linux中fork函数详解
- java可变参数例子:求学生成绩信息,不确定课程数
- 回调函数
- centos 6.7之httpd配置
- CentOS开关机命令
- CodeForces 105A
- 多态
- gcov测试代码覆盖率的命令
- 活动安排问题二
- hibernate_validator_04
- java中字符串加号的实现
- 背包问题
- CentOS7 使用的定制
- linux接触体验(周年记)
- [原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo
- Socket入门-获取服务器时间实例
- Problem 1014 xxx游戏 暴力+拓扑排序