二叉树的遍历
来源:互联网 发布:seo诊断seo8 编辑:程序博客网 时间:2024/06/17 12:21
参考博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
二叉树的递归输出:
#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>using namespace std;struct BiTNode{ int data; BiTNode *lchild,*rchild;};void CreateBiTree(BiTNode* &T){ int w; cin>>w; if(w==0) T=NULL; else { T=(BiTNode*)malloc(sizeof(BiTNode)); T->data=w; CreateBiTree(T->lchild); CreateBiTree(T->rchild); }}void PreOrderTraverse(BiTNode* T){ if(T!=NULL) { cout<<T->data<<" "; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); }}void InOrderTraverse(BiTNode* T){ if(T!=NULL) { InOrderTraverse(T->lchild); cout<<T->data<<" "; InOrderTraverse(T->rchild); }}void PostOrderTraverse(BiTNode* T){ if(T!=NULL) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); cout<<T->data<<" "; }}int main(){ BiTNode* T=NULL; CreateBiTree(T);//前序输入二叉树,0表示空树 PreOrderTraverse(T); cout<<endl; InOrderTraverse(T); cout<<endl; PostOrderTraverse(T); cout<<endl; return 0;}
二叉树的非递归输出:
#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<stack>using namespace std;struct BiTNode{ int data; BiTNode *lchild,*rchild;};void CreateBiTree(BiTNode* &T){ int w; cin>>w; if(w==0) T=NULL; else { T=(BiTNode*)malloc(sizeof(BiTNode)); T->data=w; CreateBiTree(T->lchild); CreateBiTree(T->rchild); }}void PreOrderTraverse(BiTNode* T){ stack<BiTNode*> s; while(!s.empty())//清空栈 s.pop(); BiTNode* p=T; while(p!=NULL||!s.empty()) { while(p!=NULL) { cout<<p->data<<" "; s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); s.pop(); p=p->rchild; } }}void InOrderTraverse(BiTNode* T)//前序和中序只是输出数据位置不一样{ stack<BiTNode*> s; while(!s.empty()) s.pop(); BiTNode* p=T; while(p!=NULL||!s.empty()) { while(p!=NULL) { s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); cout<<p->data<<" "; s.pop(); p=p->rchild; } }}/*要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。*/void PostOrderTraverse(BiTNode* T){ stack<BiTNode*> s; while(!s.empty()) s.pop(); BiTNode* pre=NULL; s.push(T); while(!s.empty()) { BiTNode* cur=s.top(); if((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild))) {//若pre是rchild,表明左节点为空或者已被访问;是lchild,表明右节点肯定是空的 cout<<cur->data<<" "; s.pop(); pre=cur; } else { if(cur->rchild!=NULL) s.push(cur->rchild); if(cur->lchild!=NULL) s.push(cur->lchild); } }}int main(){ BiTNode* T=NULL; CreateBiTree(T);//前序输入二叉树,0表示空树 PreOrderTraverse(T); cout<<endl; InOrderTraverse(T); cout<<endl; PostOrderTraverse(T); cout<<endl; return 0;}
阅读全文
1 0
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 剑指offer--入栈、出栈正确性的判断
- C语言-数据结构-双链表插入查找
- CentOS7下安装MySQL5.7安装与配置(YUM)
- CSS选择器详解1——常用选择器
- C++和Java的浅层拷贝与深层拷贝
- 二叉树的遍历
- POJ 1177 Picture 笔记
- 你需要理解的 Java 反射机制知识总结
- Python压缩文件
- 4883: [Lydsy2017年5月月赛]棋盘上的守卫
- 在网页中使用个性字体
- 汇编--学习笔记(四)-DOS功能调用
- VS2010快速调整格式
- <测试架构师修炼之道>读书笔记1