二叉树的常用操作(创建、先中后序递归与非递归遍历、层序遍历)

编译环境


IDE:  codeblocks

Compiler: GNU GCC

 

创建的二叉树结构图如下:

 

/*************************************************************************** * 功 能:二叉树的常用操作(创建、先中后序递归与非递归遍历、层序遍历) * 作 者:JarvisChu * 时 间:2011-04-24 ****************************************************************************/ #include <iostream> #include <malloc.h> #include <queue> #include <stack> //#include <string> //#define _DEBUG_CODE //输出调试过程中变量的值 //#define _DEBUG_CODE_STACK //测试栈 //#define _DEBUG_CODE_QUEUE //测试队列 using namespace std; typedef struct BiTNode { //二叉树 char data; struct BiTNode* lchild;//左孩子 struct BiTNode* rchild;//右孩子 } BiTNode,BiTree; bool Visit(BiTNode* node) { cout<<node->data<<" "; return true; } //初始化二叉树,分配头结点的空间 bool InitBiTree(BiTree* T) { if(T != NULL){ T->data='t'; T->lchild = T->rchild = NULL; return true; } return false; } //构建二叉树 bool CreateBiTree(BiTree* T) { BiTNode* node; node = (BiTNode*)malloc(sizeof(BiTNode)); //根节点 if(node == NULL) { return false; } node->data = 'a'; node->lchild = NULL; node->rchild = NULL; T->lchild = node; #ifdef _DEBUG_CODE cout<<"根节点创建成功"<<endl; cout<<T->data<<endl; #endif node = (BiTNode*)malloc(sizeof(BiTNode));//左孩子 if(node == NULL) { return false; } node->data = 'b'; node->lchild = NULL; node->rchild = NULL; T->lchild->lchild = node; node = (BiTNode*)malloc(sizeof(BiTNode));//右孩子 if(node == NULL) { return false; } node->data = 'c'; node->lchild = NULL; node->rchild = NULL; T->lchild->rchild = node; return true; } //销毁二叉树,释放空间 bool DestroyTree(BiTree* T) { //递归释放(后续遍历) if(T != NULL) { DestroyTree(T->lchild); DestroyTree(T->rchild); free(T); } return true; } //递归先序遍历二叉树 bool PreOrderTraverse(BiTree* T) { if(T != NULL) { cout<<T->data<<" "; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } return true; } //递归中序遍历二叉树 bool InOrderTraverse(BiTree* T) { if(T != NULL) { InOrderTraverse(T->lchild); cout<<T->data<<" "; InOrderTraverse(T->rchild); } return true; } //递归后序遍历二叉树 bool PostOrderTraverse(BiTree* T) { if(T != NULL) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); cout<<T->data<<" "; } return true; } //非递归先序遍历二叉树 bool PreOrderTraverse_n(BiTree* T){//压栈时访问 #ifdef _DEBUG_CODE_STACK //测试栈 stack<int> s; s.push(1); s.push(2); s.push(3); int i = (int)s.top(); cout<<i<<endl; #else stack<BiTNode*> s; BiTNode* node; node = T; while(!s.empty() || node != NULL){//栈不空或者node不空时做循环 while(node != NULL){ Visit(node);//访问节点 s.push(node);//压栈 node = node->lchild;//访问左子树 } node = (BiTNode*)s.top();//栈顶节点 s.pop();//弹栈 if(node != NULL){ node = node->rchild;//访问右子树 } } #endif return true; } //非递归中序遍历二叉树 bool InOrderTraverse_n(BiTree* T){//弹栈时访问 stack<BiTNode*> s; BiTNode* node; node = T; while(!s.empty() || node != NULL){//栈不空或者node不空时做循环 while(node != NULL){ s.push(node);//压栈 node = node->lchild;//访问左子树 } node = (BiTNode*)s.top();//栈顶节点 s.pop();//弹栈 if(node != NULL){ Visit(node);//访问节点 node = node->rchild;//访问右子树 } } return true; } //非递归后序遍历二叉树 bool PostOrderTraverse_n(BiTree* T){ stack<BiTNode*> s; BiTNode* node; BiTNode* pre; node = T; while(!s.empty() || node != NULL){//栈不空或者node不空时做循环 while(node != NULL){ s.push(node);//压栈 node = node->lchild;//访问左子树 } node = (BiTNode*)s.top();//栈顶节点 if(node->rchild == NULL || node->rchild == pre){//node的右孩子是空,或者刚刚被访问过了 Visit(node);//访问 s.pop();//弹栈 pre = node; node = NULL; } else{ node = node->rchild; } } return true; } //层序遍历二叉树 bool LevelOrderTraverse(BiTree* T){ #ifdef _DEBUG_CODE_QUEUE queue<int> q; q.push(1); q.push(2); q.push(3); q.push(4); cout<<(int)q.front()<<endl; q.pop(); cout<<(int)q.front()<<endl; q.pop(); cout<<(int)q.front()<<endl; q.pop(); cout<<(int)q.front()<<endl; #else queue<BiTNode*> q;//节点队列 BiTNode* node; if(T != NULL){//不是空树 q.push(T); } else{ return false; } while(!q.empty()){ node = (BiTNode*) q.front();//队首节点 q.pop();//队首节点出队 Visit(node); if(node->lchild != NULL){ q.push(node->lchild); } if(node->rchild != NULL){ q.push(node->rchild); } } #endif return true; } int main() { BiTree* T = NULL; T = (BiTree*)malloc(sizeof(BiTree));//分配头结点 if(T == NULL) { cout<<"非配头结点失败"<<endl; return 1; } if(!InitBiTree(T)) {//初始化二叉树 cout<<"初始化失败"<<endl; } CreateBiTree(T);//构建二叉树 #ifdef _DEBUG_CODE cout<<T->lchild->data<<endl; cout<<T->lchild->lchild->data<<endl; cout<<T->lchild->rchild->data<<endl; #endif cout<<"*********递归先序遍历**********"<<endl; PreOrderTraverse(T);//先序遍历 cout<<endl<<"*********递归中序遍历**********"<<endl; InOrderTraverse(T);//中序遍历 cout<<endl<<"*********递归后序遍历**********"<<endl; PostOrderTraverse(T); cout<<endl<<"********非递归先序遍历**********"<<endl; PreOrderTraverse_n(T); cout<<endl<<"********非递归中序遍历**********"<<endl; InOrderTraverse_n(T); cout<<endl<<"********非递归后序遍历**********"<<endl; PostOrderTraverse_n(T); cout<<endl<<"********层序遍历**********"<<endl; LevelOrderTraverse(T); return 0; }

 

转载于:https://www.cnblogs.com/JarvisChu/archive/2011/04/24/2752497.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值