不用堆栈实现树的先序遍历
2015-09-03 18:29
459 查看
通常实现树的先序遍历时,我们都需要一个栈来记录位置信息,如果一颗二叉树当中本来就保存了指向父亲的节点,那么我们可以不用堆栈来实现先序遍历。
以上代码可以直接运行。
#include<iostream> using namespace std; class node { public: char value; node *parent,*left,*right; node(char v):parent(0),left(0),right(0) { value=v; } }; void first(node *r) { if(r!=NULL) { cout<<r->value<<endl; first(r->left); first(r->right); } } void fun(node *r) { node *p=r; node *q; bool xunhuan=true; while(xunhuan) { if(p) { cout<<p->value<<endl; if(p->left!=NULL)// 往左走 { p=p->left; } else { if(p->right!=NULL) { p=p->right; } else { bool flag=true; while(true) { while(p->parent!=NULL&&p->parent->right==p) p=p->parent; if(p->parent==NULL) { xunhuan=false; break; } p=p->parent; while(p->parent==NULL||p==p->parent->left) { if(p->right!=NULL) { p=p->right; flag=false; break; } } if(!flag) { flag=true; break; } if(p->parent==NULL) { xunhuan=false; break; } } } } } } } void main() { node A('A'),B('B'),C('C'),D('D'),E('E'),F('F'); A.left=&B; A.right=&C; B.parent=&A; C.parent=&A; B.left=&D; B.right=&E; D.parent=&B; E.parent=&B; C.left=&F; F.parent=&C; first(&A); cout<<"循环遍历"<<endl; fun(&A); system("pause"); }
以上代码可以直接运行。
相关文章推荐
- C++基础---string类的find/find_first_of/find_first_not_of/rfind/find_last_of/find_last_not_of
- PCIe 驱动流程(LTSSM)
- 阻塞与非阻塞,同步与异步
- 定位
- sql server 2012 报表开发(4) Reporting Service 行转列方法
- ATS 5.3.0中parent.config配置文件解读
- JavaScript进阶
- CPlus的简单线程的制作
- 扩展欧几里得算法
- C++基础---string类的operator==/operator!=/operator</operator<=/operator>/operator>=/compare
- GCJ 2008 Round1AA
- 组合数C(n,m)的计算
- C++函数中那些不可以被声明为虚函数的函数
- 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest H Milestones1 (暴力)
- 框架模式MVP在Android中的使用
- 对加权(无负值边)的图进行最短路径搜索
- Win10系统“获取会员版本”选项不可用怎么办?“获取会员版本”选项不可用的解决方法
- C++基础---string类的operator=/assign
- myeclipse2014配置spring
- C语言中链表怎么删除结点?