树的遍历

来源:互联网 发布:隐形眼镜 品牌 知乎 编辑:程序博客网 时间:2024/05/02 04:38

#include<iostream> #include<queue> #include<stack> using namespace std; //二叉树结点的描述 typedef struct BiTNode{ char data; struct BiTNode *lchild, *rchild; //左右孩子 }BiTNode,*BiTree; //按先序遍历创建二叉树 BiTNode *CreateBiTree( ) //返回结点指针类型 (也可以用二级指针作为函数参数) { BiTNode *root;char ch; //要插入的节点的数据 cin>>ch;if(ch=='#')root = NULL;else{root = (BiTNode *)malloc(sizeof(BiTNode));root->data = ch;printf("请输入%c的左孩子:",ch);root->lchild=CreateBiTree( );printf("请输入%c的右孩子:",ch);root->rchild=CreateBiTree( );}return root;} //前序遍历的递归算法程序 void PreOrder(BiTNode *root){ if(root==NULL) return ; printf("%c ", root->data); //输出数据 PreOrder(root->lchild); //递归调用,前序遍历左子树 PreOrder(root->rchild); //递归调用,前序遍历右子树 } //中序遍历的递归算法程序 void InOrder(BiTNode *root) { if(root==NULL)return ;InOrder(root->lchild); //递归调用,前序遍历左子树 printf("%c ", root->data); //输出数据 InOrder(root->rchild); //递归调用,前序遍历右子树 } //后序遍历的递归算法程序 void PostOrder(BiTNode *root){if(root==NULL)return ;PostOrder(root->lchild); //递归调用,前序遍历左子树 PostOrder(root->rchild); //递归调用,前序遍历右子树 printf("%c ", root->data); //输出数据 } //先序遍历的非递归 void PreOrder_Nonrecursive(BiTree T) {if(!T) return ;stack<BiTree> s;BiTree curr = T;while(curr != NULL || !s.empty()){while(curr != NULL){cout<<curr->data<<" ";s.push(curr);curr = curr->lchild;}if(!s.empty()){curr = s.top();s.pop();curr = curr->rchild;}}}// 中序遍历的非递归 void InOrderTraverse(BiTree T) { if(!T) return ; BiTree curr = T; // 指向当前要检查的节点 stack<BiTree> s;while(curr != NULL || !s.empty()){while(curr != NULL){s.push(curr);curr = curr->lchild;}//whileif(!s.empty()){curr = s.top();s.pop();cout<<curr->data<<" ";curr = curr->rchild;}}}// 后序遍历的非递归 void PostOrder_Nonrecursive(BiTree T) { stack<BiTree> S; BiTree curr = T ; // 指向当前要检查的节点 BiTree previsited = NULL; // 指向前一个被访问的节点 while(curr != NULL || !S.empty()) // 栈空时结束 { while(curr != NULL) // 一直向左走直到为空 { S.push(curr); curr = curr->lchild; } curr = S.top(); // 当前节点的右孩子如果不为空并且未被访问,则访问右子树 if(curr->rchild!= NULL && curr->rchild!= previsited) { curr = curr->rchild; } else // 否则访问当前节点 {cout<<curr->data<<" "; previsited = curr; S.pop(); curr = NULL; }} } //递归层次遍历int depth(BiTNode *T) //树的深度 { if(!T) return 0; int d1,d2; d1=depth(T->lchild); d2=depth(T->rchild); return (d1>d2?d1:d2)+1; //return (depth(T->lchild)>depth(T->rchild)?depth(T->lchild):depth(T->rchild))+1;} void PrintNodeAtLevel(BiTree T,int level)//输出节点{// 空树或层级不合理if (NULL == T || level < 1 )return;if (1 == level){cout<<T->data<<" ";return;}// 左子树的 level - 1 级PrintNodeAtLevel(T->lchild, level - 1);// 右子树的 level - 1 级PrintNodeAtLevel(T->rchild, level - 1);}void LevelTraverserecursive(BiTree T)//递归层次遍历{if (NULL == T)return;int Depth;Depth = depth(T);int i;for (i = 1; i <= Depth; i++){PrintNodeAtLevel(T, i);//cout << endl; 每一层都换行}}//非递归层次遍历void LevelOrder(BiTree BT) //非递归层次遍历二叉树 { BiTNode *queue[10];//定义队列有十个空间 if (BT==NULL) return; int front,rear; front=rear=0; queue[rear++]=BT; while(front!=rear)//如果队尾指针不等于对头指针时 { cout<<queue[front]->data<<" "; //输出遍历结果 if(queue[front]->lchild!=NULL) //将队首结点的左孩子指针入队列 { queue[rear]=queue[front]->lchild; rear++; //队尾指针后移一位 } if(queue[front]->rchild!=NULL) { queue[rear]=queue[front]->rchild; //将队首结点的右孩子指针入队列 rear++; //队尾指针后移一位 } front++; //对头指针后移一位 } } //求树的节点数量int CountNode(BiTNode *T) { if(T == NULL) return 0; return 1+CountNode(T->lchild)+CountNode(T->rchild); } int main(void) { BiTNode *root=NULL; //定义一个根结点 int flag=1,k; printf(" 本程序实现二叉树的基本操作。\n"); printf("可以进行建立二叉树,递归先序、中序、后序遍历,非递归先序、中序遍历及非递归层序遍历等操作。\n"); while(flag) { printf("\n"); printf("|--------------------------------------------------------------|\n"); printf("| 二叉树的基本操作如下: |\n"); printf("| 0.创建二叉树 |\n"); printf("| 1.递归先序遍历 |\n"); printf("| 2.递归中序遍历 |\n"); printf("| 3.递归后序遍历 |\n"); printf("| 4.非递归先序遍历 |\n"); printf("| 5.非递归中序遍历 |\n"); printf("| 6.非递归后序遍历 |\n"); printf("| 7.递归层序遍历 |\n"); printf("| 8.非递归层序遍历 |\n"); printf("| 9.二叉树的深度 |\n"); printf("| 10.二叉树的结点个数 |\n"); printf("| 11.退出程序 |\n"); printf("|--------------------------------------------------------------|\n"); printf(" 请选择功能:"); scanf("%d",&k); switch(k) { case 0: printf("请建立二叉树并输入二叉树的根节点:"); root=CreateBiTree( ); break; case 1: if(root) { printf("递归先序遍历二叉树的结果为:"); PreOrder(root); printf("\n"); } else printf(" 二叉树为空!\n"); break; case 2: if(root) { printf("递归中序遍历二叉树的结果为:"); InOrder(root); printf("\n"); } else printf(" 二叉树为空!\n"); break; case 3: if(root) { printf("递归后序遍历二叉树的结果为:"); PostOrder(root); printf("\n"); } else printf(" 二叉树为空!\n"); break; case 4: if(root) { printf("非递归先序遍历二叉树:"); PreOrder_Nonrecursive(root); printf("\n"); } else printf(" 二叉树为空!\n"); break; case 5: if(root) { printf("非递归中序遍历二叉树:"); InOrderTraverse(root); printf("\n"); } else printf(" 二叉树为空!\n"); break; case 6: if(root) { printf("非递归后序遍历二叉树:"); PostOrder_Nonrecursive(root); printf("\n"); } else printf(" 二叉树为空!\n"); break; case 7: if(root) { printf("递归层序遍历二叉树:"); LevelTraverserecursive(root); printf("\n"); } else printf(" 二叉树为空!\n"); break; case 8: if(root) { printf("非递归层序遍历二叉树:"); //LeverTraverse(root); LevelOrder(root); printf("\n"); } else printf(" 二叉树为空!\n"); break; case 9: if(root) printf("这棵二叉树的深度为:%d\n",depth(root)); else printf(" 二叉树为空!\n"); break; case 10: if(root) printf("这棵二叉树的结点个数为:%d\n",CountNode(root)); else printf(" 二叉树为空!\n"); break; default: flag=0; printf("程序运行结束!\n");} } system("pause"); return 0; }

0 0
原创粉丝点击