二叉树的创建以及利用迭代实现中序、先序、后序遍历、清空
来源:互联网 发布:java相关的技术有哪些 编辑:程序博客网 时间:2024/05/16 12:57
/*二叉链表就是以链表为存储结构存储二叉树 ,我么要像编号 完全二叉树一样 存储 普通的二叉树 。 节点的声明如下 node */#include <iostream>using namespace std ;typedef struct node{ int data ; node* lChild ; node* rChild ;}BTreeNode,*LinkTree ;
void CreateTree(LinkTree*pTree,int nIndex[],char ch[]) //nIndex是二叉树的节点编号数组 ch是节点数据 每个编号对应一个字符 nIndex 等于0时候结束 ch='#'结束{ int i =1 ;//用作下标 int j ;//当前双亲节点的下标 LinkTree temNode[50] ;//辅助建立二叉链表 BTreeNode *newNode =NULL;//用来指向新分配的节点空间 while(nIndex[i]!=0&&ch[i]!='#') //如果没有到达最后一个节点 { newNode=new BTreeNode ; newNode->data=ch[i] ; //为节点赋值 newNode->lChild=newNode->rChild=NULL ;//lChild=rChild=NULL temNode[nIndex[i]]=newNode ;//将这个新节点保存在辅助节点数组的指定编号为下标的元素中。 if(nIndex[i]==1) //如果是根节点的话那么我们将这个节点的地址保存在pTree中。 { *pTree=newNode ; } else { j=nIndex[i]/2 ;//获得双亲节点的编号 也就是数组下标 if(nIndex[i]%2==0) temNode[j]->lChild=newNode ; //编号基数那么是左子树 else temNode[j]->rChild=newNode ; //编号是偶数那么是右子树 } i++ ; //索引自加1 } }void Preorder(LinkTree pTree) //递归方式实现先序遍历{ if(pTree!=NULL) { cout<<pTree->data<<" " ; Preorder(pTree->lChild) ; Preorder(pTree->rChild) ; } }void Inorder(LinkTree pTree) //中序遍历{ if(pTree!=NULL) { Inorder(pTree->lChild) ; cout<<pTree->data<<" " ; Inorder(pTree->rChild) ; } }void Postorder(LinkTree pTree) //后序遍历{ if(pTree!=NULL) { Postorder(pTree->lChild) ; Postorder(pTree->rChild) ; cout<<pTree->data<<" "; }}
void Postorder(LinkTree pTree) //后序遍历{ if(pTree!=NULL) { Postorder(pTree->lChild) ; Postorder(pTree->rChild) ; cout<<pTree->data<<" "; }}
/* 按照层次进行遍历 需要用到队列 循环队列 思想是把所有的节点进队列 进入队列的节点输出data 然后将这个节点的lChild rChild 不为NULL的孩子节点进入队列 。 进行一个 Rear!=Front的while循环 */void Traverse(BTreeNode*pTree){ BTreeNode* queue[MAX_SIZE] ; //指针队列数组保存遍历过的节点的指针 BTreeNode*tem=NULL; //临时指针保存出队列的节点 int Front = 0; int Rear = 0; if(pTree!=NULL) //初始化队尾为树的第一个节点 { Rear=(Rear+1)%MAX_SIZE; //队尾+1 queue[Rear]=pTree ; //节点指针进队尾 } while(Rear!=Front) { Front=(Front+1)%MAX_SIZE ; tem=queue[Front] ; cout<<tem->data<<" " ; if(tem->lChild!=NULL) //如果出队列的lChild不为空的话 那么进队列 { Rear=(Rear+1)%MAX_SIZE ; //lChild进队列 queue[Rear]=tem->lChild ;
} if(tem->rChild!=NULL ) //如果出队列的节点的rChild不为空的话 那么进队列 {
Rear=(Rear+1)%MAX_SIZE ; //rChild进队列 queue[Rear]=tem->rChild; }
}
}
void main(){ LinkTree pTree ; int nIndex[]={9999,1,2,3,4,5,6,7,8,9,0} ; char ch[]={'?',1,2,3,4,5,6,7,8,9,'#'}; CreateTree(&pTree,nIndex,ch); cout<<"先序遍历结果:"<<endl ; Preorder(pTree) ; cout<<endl ; cout<<"中序遍历结果:"<<endl ; Inorder(pTree) ; cout<<endl ; cout<<"后续遍历结果:"<<endl ; Postorder(pTree) ; cout<<endl ;
ClearTree(&pTree) ;
}
- 二叉树的创建以及利用迭代实现中序、先序、后序遍历、清空
- 二叉树的创建,先序、中序、后序遍历的递归实现以及层序遍历
- 二叉树的遍历(先序/中序/后序,递归/迭代)与搜索
- 二叉树的创建、先序、中序以及后序遍历
- Java实现二叉树,以及先序、中序、后序遍历算法的实现
- 利用栈实现的二叉树的先、中、后序遍历
- C++ 二叉树实现 创建,先序遍历,中序遍历,后序遍历
- 二叉树的创建与先、中、后序遍历递归实现
- 利用先序遍历创建二叉树的后序遍历序列(0979)
- C++实现二叉树所有操作 -- 创建递归遍历迭代遍历拷贝清空查找
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- 二叉树的创建,先序遍历,中序遍历,后序遍历
- java实现二叉树,以及二叉树的遍历和先序和后序求解
- 利用对象的思想创建二叉树并实现四种遍历(广序,先序,中序,后序)-python3版
- C实现二叉树的先序遍历,中序遍历,后序遍历
- c语言实现二叉树的先序遍历,中序遍历,后序遍历
- 二叉树T 的先序遍历、中序遍历、后序遍历(递归实现)
- java实现二叉树的先序遍历,中序遍历,后序遍历
- 硬件常用术语
- Linux各发行版本 优缺点 简介
- 散列表开放定址法的初始化、插入、打印等函数(c)
- SQL Server2000后台导入Excel数据
- Oracle WorkSpace 诠释和案例
- 二叉树的创建以及利用迭代实现中序、先序、后序遍历、清空
- ARM Linux 交叉调试工具及方法
- “恒之勋章”不能丢
- Anthem无刷新控件
- Mac OS X Lion下找不到GCC 的解决方法
- Spring事务配置的五种方式
- 波兰式,逆波兰式
- 分层的测试
- 马无夜草不肥:程序员做业余项目的重要性