遍历二叉树的全部方法(递归+非递归)

#include<iostream>    
#include<queue>    
#include<stack>    
using namespace std;    //二叉树结点的描述    
typedef struct BiTNode  
{    char data;    struct BiTNode *lchild, *rchild;      //左右孩子    
}BiTNode,*BiTree;    //按先序遍历创建二叉树    
//BiTree *CreateBiTree()     //返回结点指针类型    
//void CreateBiTree(BiTree &root)      //引用类型的参数    
void CreateBiTree(BiTNode **root)    //二级指针作为函数参数    
{    char ch; //要插入的数据    scanf("\n%c", &ch);  //cin>>ch;    if(ch=='#')  *root = NULL;  else  {  *root = (BiTNode *)malloc(sizeof(BiTNode));  (*root)->data = ch;  printf("请输入%c的左孩子:",ch);  CreateBiTree(&((*root)->lchild));  printf("请输入%c的右孩子:",ch);  CreateBiTree(&((*root)->rchild));  }  
}  //前序遍历的算法程序    
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;    s.push(T);    while(!s.empty())    {    BiTree temp = s.top();    cout<<temp->data<<" ";    s.pop();    if(temp->rchild)    s.push(temp->rchild);    if(temp->lchild)    s.push(temp->lchild);    }    
}    void PreOrder_Nonrecursive1(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 PreOrder_Nonrecursive2(BiTree T)     //先序遍历的非递归    
{    if(!T)  return ;    stack<BiTree> s;    while(T)          // 左子树上的节点全部压入到栈中    {    s.push(T);    cout<<T->data<<"  ";    T = T->lchild;    }    while(!s.empty())    {            BiTree temp = s.top()->rchild;  // 栈顶元素的右子树    s.pop();                        // 弹出栈顶元素    while(temp)          // 栈顶元素存在右子树,则对右子树同样遍历到最下方    {    cout<<temp->data<<"  ";    s.push(temp);    temp = temp->lchild;    }    }    
}    void InOrderTraverse1(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;  }//while  if(!s.empty())  {  curr = s.top();  s.pop();  cout<<curr->data<<"  ";  curr = curr->rchild;  }  }  
}  void InOrderTraverse(BiTree T)   // 中序遍历的非递归    
{    if(!T)    return ;    stack<BiTree> s;    BiTree curr = T->lchild;    // 指向当前要检查的节点    s.push(T);    while(curr != NULL || !s.empty())    {    while(curr != NULL)    // 一直向左走    {    s.push(curr);    curr = curr->lchild;    }    curr = s.top();    s.pop();    cout<<curr->data<<"  ";    curr = curr->rchild;    }    
}    void PostOrder_Nonrecursive1(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)      {      cout<<curr->data<<"  ";      previsited = curr;      S.pop();      curr = NULL;      }      else    curr = curr->rchild;      // 否则访问右孩子    }      
}     void PostOrder_Nonrecursive(BiTree T)  // 后序遍历的非递归     双栈法    
{      stack<BiTree> s1 , s2;      BiTree curr ;           // 指向当前要检查的节点    s1.push(T);    while(!s1.empty())  // 栈空时结束      {    curr = s1.top();    s1.pop();    s2.push(curr);    if(curr->lchild)    s1.push(curr->lchild);    if(curr->rchild)    s1.push(curr->rchild);    }    while(!s2.empty())    {    printf("%c ", s2.top()->data);    s2.pop();    }    
}    int visit(BiTree T)    
{    if(T)    {    printf("%c ",T->data);    return 1;    }    else    return 0;    
}    void LeverTraverse(BiTree T)   //方法一、非递归层次遍历二叉树     
{    queue <BiTree> Q;    BiTree p;    p = T;    if(visit(p)==1)    Q.push(p);    while(!Q.empty())    {    p = Q.front();    Q.pop();    if(visit(p->lchild) == 1)     Q.push(p->lchild);    if(visit(p->rchild) == 1)    Q.push(p->rchild);    }    
}    
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 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;    
}    
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("|--------------------------------------------------------------|\n");    printf("                        请选择功能:");    scanf("%d",&k);    switch(k)    {    case 0:    printf("请建立二叉树并输入二叉树的根节点:");    CreateBiTree(&root);    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_Nonrecursive1(root);    printf("\n");    }    else    printf("          二叉树为空!\n");    break;    case 5:    if(root)    {    printf("非递归中序遍历二叉树:");    InOrderTraverse1(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("非递归层序遍历二叉树:");    //LeverTraverse(root);    LevelOrder(root);    printf("\n");    }    else    printf("          二叉树为空!\n");    break;    case 8:    if(root)    printf("这棵二叉树的深度为:%d\n",depth(root));    else    printf("          二叉树为空!\n");    break;    case 9:    if(root)    printf("这棵二叉树的结点个数为:%d\n",CountNode(root));    else    printf("          二叉树为空!\n");    break;    default:    flag=0;    printf("程序运行结束,按任意键退出!\n");    }    }    system("pause");    return 0;    
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在本地搭建一个Android应用crashing跟踪系统-ACRA

https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9C%AC%E5%9C%B0%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAndroid%E5%BA%94%E7%94%A8crashing%E8%B7%9F%E8%B8%AA%E7%B3%BB%E7%BB%9F%EF%BC%8DACRA 如何在本地搭建一个Andr…

20165222第一周查漏补缺

一&#xff0c;第一章要点总结 1&#xff0c;java的特点&#xff1a;面向对象&#xff0c;动态&#xff0c;平台无关。 2&#xff0c;对于带包程序的编译&#xff1a;注意javac -d 编译到一个文件夹内&#xff0c;然后java -cp 文件夹名 包名.类名。 第一章是比较简单的&#x…

学习中的十七条建议

作者&#xff1a;孤剑 对于一个自学的人来说&#xff0c;几条规则当然是必要的了&#xff0c;以下是我自己的一些心得。 1。自信是你成功的第一要素&#xff1b; 2。用心去学&#xff0c;活学活用&#xff1b; 3。新手不要“好高骛远”&#xff0c;老手不要“骄傲自大”&#x…

tp5 linux路由不跳转,thinkphp5路由不生效一直跳到首页的解决方法

自从用laravel框架后&#xff0c;好久没用过thinkphp框架了&#xff0c;早期用的3.x系列&#xff0c;想熟悉一下thinkphp5&#xff0c;结果入坑了&#xff1b;路由配置一直不起作用&#xff0c;总是跳到首页&#xff0c;折腾了好久&#xff0c;后来发现是nginx配置的问题&#…

stack堆栈简介

stack堆栈简介 堆栈是一个线性表&#xff0c;插入和删除只在表的一端进行。这一端称为栈顶(Stack Top)&#xff0c;另一端则为栈底(Stack Bottom)。堆栈的元素插入称为入栈&#xff0c;元素的删除称为出栈。由于元素的入栈和出栈总在栈顶进行&#xff0c;因此&#xff0c;堆栈是…

一份从 0 到 1 的 Java 项目实践清单

2019独角兽企业重金招聘Python工程师标准>>> 看了一篇文章&#xff0c;感觉还可以&#xff0c;就给大家共享一下&#xff1a; 对于着手一个项目的时候&#xff0c;要从以下入手&#xff08;即项目清单&#xff09;&#xff1a; 1. 项目规划 1.1 首先&#xff0c;你得…

JWT 简介

JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准&#xff08;RFC 7519&#xff09;&#xff0c;定义了一种简洁的&#xff0c;自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在&#xff0c;这些信…

FFMPEG的详细资料可以在它的官方网站上找到

请看官网的文档栏目: http://ffmpeg.mplayerhq.hu/documentation.html FFmpeg System Documentation Frequently Asked QuestionsFFmpeg program documentationffserver documentationffplay documentationvideo hook documentationsample ffserver configuration fileFFmpeg A…

空指针入栈问题

空指针和数据元素一样能够进栈。并且如果栈原来为空&#xff0c;压入空指针后栈就不会为空了。空指针一旦被赋予指针&#xff0c;如果是在32位机上则占四个字节。只不过是没有指向堆内存中的任何数据。而空指针已经压进栈了&#xff0c;不加以释放就一直存在。

arm linux 中断 分析,armlinux中断异常的处理分析.pdf

基于 ARM Linux 中断、异常的处理分析本文是基于ARM S3C2410X 系统的Linux 2.6 中断、异常和系统调用的处理分析。主要有以下几个部分&#xff1a;1. ARM 的硬件中断机制2. Linux 2.6 对 ARM 中断向量表的初始化3. Linux 2.6 对 ARM 中断、异常的处理(从汇编-->C 语言函数&a…

(数据科学学习手札03)Python与R在随机数生成上的异同

随机数的使用是很多算法的关键步骤&#xff0c;例如蒙特卡洛法、遗传算法中的轮盘赌法的过程&#xff0c;因此对于任意一种语言&#xff0c;掌握其各类型随机数生成的方法至关重要&#xff0c;Python与R在随机数底层生成上都依靠梅森旋转&#xff08;twister&#xff09;来生成…

音视频编解码知识学习详解(分多部分进行详细分析)

1. 常用的基本知识 基本概念 编解码 编解码器&#xff08;codec&#xff09;指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序。这里指的变换既包括将信号或者数据流进行编码&#xff08;通常是为了传输、存储或者加密&#xff09;或者提取得到一个编码流的操作…

二叉树非递归后序遍历算法

与正常的非递归中序遍历算法不同于两点&#xff1a; 一 比正常的中序遍历算法多了对数据元素的标记。 在压数据元素入栈&#xff08;标记记为0&#xff0c;用来表示访问了其左子树&#xff09;时标记&#xff0c; 还有访问完左子树利用gettop&#xff08;&#xff09;获取双亲…

SQL*Plus命令

SQL*Plus命令 前言 一&#xff1a;SQL*Plus 与数据库的交互 二&#xff1a;设置SQL* Plus的运行环境 二 - 1 &#xff1a;SET命令概述 二 - 2 &#xff1a;使用SET命令设置运行环境 二 - 2 ____1&#xff1a;Pagesize 变量 1 SYSorcl> show pagesize2 pages…

redis-day1

1 Redis 概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统。redis和大名鼎鼎的Memcached缓存服务软件很像&#xff0c;但是Redis支持的数据存储类型比Memcached更丰富&#xff0c;包括strings&#xff08;字符串&#xff09;、lists&…

C语言数码管是共阴共阳程序,C语言实现共阴极数码管操作

共阴极或者共阳极数码管&#xff0c;因为其需要电流大&#xff0c;而一般51输出电流低&#xff0c;需要锁存器。买的开发板使用的共阴极数码管。至于其构造&#xff0c;找个相关方面的书看看&#xff0c;这里主要是对做好的电路板进行编程。刚开始的时候&#xff0c;感觉在数码…

数据库主要特点

(1)实现数据共享。数据共享包含所有用户可同时存取数据库中的数据&#xff0c;也包括用户可以用各种方式通过接口使用数据库&#xff0c;并提供数据共享。 (2)减少数据的冗余度。同文件系统相比&#xff0c;由于数据库实现了数据共享&#xff0c;从而避免了用户各自建立应用文…

百度与华为全面战略合作 人工智能手机真的要来了

视频加载中...12月21日百度和华为在北京宣布达成全面战略合作。这次合作内容主要包括三点&#xff0c;首先是在语音、语义、视觉和VR上的自然交互&#xff0c;这是百度为华为手机AI赋能的基础层。第二是基于华为HiAI平台和百度PaddlePaddle深度学习框架&#xff0c;共建人工智能…

JavaScript数据类型

一、JavaScript数据类型主要分为原始类型和引用数据类型。 原始类型包括(不可拆分的东西)&#xff1a;Number、String、Boolean、Null、Undefined。引用数据类型包括&#xff1a;Object&#xff08;Array&#xff0c;Date&#xff0c;RegExp&#xff0c;Function&#xff09;ty…

funcode拼图游戏c语言程序,同求funcode平台下拼图游戏的C语言代码

做了好几天&#xff0c;写了好多回就是不对&#xff0c;彻底崩溃。。#include "CommonAPI.h"//#include "LessonX.h"#include#define BLOCK_COUNT 4int g_iGameState;intg_iBlockState[BLOCK_COUNT][BLOCK_COUNT];charg_szBlockName[BLOCK_COUNT*BLOCK_COU…