目录

1、二叉树的定义

2、二叉树的遍历

2.1、先序遍历

递归版

非递归版

2.2、中序遍历

递归版

非递归版

2.3、后序遍历

递归版

非递归版

2.4、层序遍历

3、二叉树的创建

4、二叉树的销毁


1、二叉树的定义

二叉树包括数据域,左孩子,右孩子。如果要要方便找双亲节点还可以添加一个指针(这里没有)

typedef int TElemType;
typedef struct BitNode
{TElemType data;BitNode *lchild, *rchild;
}BitNode,*BitTree;

2、二叉树的遍历

二叉树的遍历是其他操作的基础,其他很多修改创建的操作,都是建立在二叉树的遍历的基础上的。

二叉树的遍历包括:先序遍历(图的DFS)、中序遍历、后序遍历、层序遍历(图的BFS)

后面的遍历实现都通过最简单的输出结点数据域来展示。其他操作操作都是在该基础修改来实现

下面几棵树为测试数据,可以作为参考使用:

/*
树 t1
            1
          /    \
        2        3
      /    \
    4        5
            /\
          6      7

输入:
1 2 4 -1 -1 5 6 7 -1 -1 -1 -1 3 -1 -1
先序 1 2 4 5 6 7 3
中序 4 2 6 5 7 1 3
后续 4 6 7 5 2 3 1

树 t2
            1
          /    \
        2        3
      /    \
    4        5
            /   \
          6      7
          /  \
        1    2

输入:
1 2 4 -1 -1 5 6  1 -1 -1 2 -1 -1 7 -1 -1 3 -1 -1
先序 1 2 4 5 6 1 2 7 3
中序 4 2 1 6 2 5 7 3 1
后序 4 1 2 6 7 5 2 3 1
树 t3

                6
               / \
             3     9
           /  \       / \
         1     4   7   10
          \        \    \    \
           2       5   8   11

输入:
6 3 1 -1 2 -1 -1 4 -1 5 -1 -1 9 7 -1 8 -1 -1 10 -1 11 -1 -1
先序 6 3 1 2 4 5 9 7 8 10 11
中序 1 2 3 4 5 6 7 8 9 10 11
后序 2 1 5 4 3 8 7 11 10 9 6

*/

2.1、先序遍历

先序遍历访问顺序: 根结点->左孩子->右孩子。

左孩子本身可以看作另外一棵树,如果还有左右孩子,也按该顺序进行遍历。

根节点非空,打印根节点内容,递归左子树,递归右子树

递归版

void PreOrderTraverse(BitTree T)
{if (T){cout << T->data << " ";PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}
}

非递归版

sta栈记录工作指针。p指向当前访问结点,当前结点非空,打印该结点,将当前指着保存到栈中,进入右子树

否则到达叶子结点,回溯,弹出栈顶,进入右子树。

void RePreOrderTraverse(BitTree T)
{stack<BitNode*> sta;BitNode *p = T;BitNode *t;//临时存储弹出元素while (p || !sta.empty()){if (p){cout << p->data << " ";//输出当前节点sta.push(p);//保存当前结点p = p->lchild;//进入左子树}else//左子树遍历完成{t = sta.top();//回到上层结点sta.pop();//弹出该层p = t->rchild;//进入右子树}}}

2.2、中序遍历

中序遍历访问顺序: 左孩子->根结点->右孩子。

递归版

void InOrderTraverse(BitTree T)
{if (T){InOrderTraverse(T->lchild);cout << T->data << " ";InOrderTraverse(T->rchild);}

非递归版

void ReInOrderTraverse(BitTree T)
{stack<BitNode*> sta;BitNode *p = T;BitNode *q;while (p || !sta.empty())//当前树或栈未空{if (p){sta.push(p);//保存当前结点p = p->lchild;//进入左子树}else//左子树访问完成{q=sta.top();//获取上一层sta.pop();//弹出cout << q->data << " ";//访问根节点p = q->rchild;//进入右子树}}
}

2.3、后序遍历

后序遍历访问顺序: 左孩子->右孩子->根结点。

递归版

void PostOrderTraverse(BitTree T)
{if (T){PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);cout << T->data << " ";}
}

非递归版

void RePostOrderTraverse(BitTree T)
{stack<BitNode*> sta;map<BitNode*,int> tag;BitNode* p = T;BitNode* t;while (p || !sta.empty()){if (p){tag[p] = 1;sta.push(p);//保存当前层p = p->lchild;//进入左子树}else//左子树遍历完成{t = sta.top();if (!t->rchild)//没有右子树,说明到达了终端{cout << t->data << " ";//打印终端sta.pop();p = t->rchild;}else {//是根节点if (tag[t] == 1)//第二次访问{tag[t] = 2;p=t->rchild;}else if(tag[t]==2){cout << t->data << " ";sta.pop();//退栈,回到上一层p = NULL;}}}}
}

2.4、层序遍历

层序遍历,即一层一层的访问二叉树,所有父节点访问后,访问其子节点,二叉树的层序遍历是通过队列实现的,所以不能通过函数递归(系统生成栈)的方式实现。

void Sequencetrav(BitTree t)
{BitNode *p;queue<BitNode*> que;que.push(t);while (!que.empty())//队列非空{p = que.front();//获取队首cout << p->data << " ";que.pop();if (p->lchild)//有左子树,入队 que.push(p->lchild);if (p->rchild)//有右子树,入队que.push(p->rchild);}
}

3、二叉树的创建

二叉树的创建,如果存在左子树或右子树为空的情况,我们需要有能够代表空的标签来填补上。

如创建int型,这里我假设全是自然数,我可以让 -1作为空的标签

void CreateBitTree(BitTree & T)
{int c;cin >> c;if (c == -1)//-1,为空结点T = nullptr;else{//否则创建结点,同时递归创建T = new BitNode;T->data = c;CreateBitTree(T->lchild);CreateBitTree(T->rchild);}
}

4、二叉树的销毁

递归,先销毁左子树,然后销毁右子树,然后销毁根节点

void DestoryTree(BitTree & t)
{if (t){DestoryTree(t->lchild);DestoryTree(t->rchild);delete[] t;t = nullptr;}
}

二叉树的增删操作都是在二叉树的遍历基础上实现,这里不在细致阐述。

二叉树的遍历 C/C++语言实现相关推荐

  1. 二叉树的遍历(c语言数据结构实验报告三)

    二叉树的遍历 一.实验目的或任务 二.实验教学基本要求 三.实验教学的内容或要求 1. 编写函数,输入字符序列,建立二叉树的二叉链表 2. 编写函数,实现二叉树的中序递归遍历算法. 3. 编写函数,实 ...

  2. 二叉树层序遍历(c语言,非递归)

    层序遍历的作用是将二叉树,从上到下,从左到右依次遍历.如下图遍历的结果是A->B->C->D->E->F->G->H.其实,这就相当于族谱一样,从辈分大到小遍 ...

  3. Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现

    Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树.二叉查找树的插入节点.二叉查找树的删除.二叉树的遍历.平衡二叉树)C++语言实现 目录 树的基础知识 1.二叉树的遍-前序 ...

  4. C语言二叉树前序遍历(附完整源码)

    C语言二叉树前序遍历 C语言二叉树前序遍历完整源码(定义,实现,main函数测试) C语言二叉树前序遍历完整源码(定义,实现,main函数测试) #include <iostream>st ...

  5. c语言利用遍历求树高的程序,用C语言实现二叉树的遍历极其应用

    用C语言实现二叉树的遍历极其应用 [1][摘要]:<数据结构>是计算机系学生的一门专业技术基础课程,计算机科学各领域及有关的应用软件都要用到各种数据结构.C语言有较丰富的数据类型.运算符以 ...

  6. c语言二叉树的遍历菜单系统,C语言二叉树的三种遍历方式的实现及原理

    C语言二叉树的三种遍历方式的实现及原理 发布时间:2020-10-03 19:43:57 来源:脚本之家 阅读:63 作者:看雪. 二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个 ...

  7. c语言二叉树的遍历菜单系统,二叉树遍历C语言的实现

    广告 提供50多种云计算产品,包括云服务器和云. 创建一站式云产品试用服务,以帮助开发人员和企业以零门槛进入云环境. 上面的代码很简单,上面的图片很容易理解. 下一点是焦点: 二叉树的遍历分为前遍,中 ...

  8. 二叉树非递归后序遍历算法(C语言)

    二叉树非递归后序遍历算法(C语言) 二叉树后序遍历的规律:左右根 后序非递归遍历中,访问根(子根)结点有两种情况 ①:遍历完左子树,需要遍历右子树,需要从栈中访问最顶上的根(子根)结点从而得到右子树的 ...

  9. 二叉树的深度优先搜索c语言,C语言 二叉树按层打印、深度优先遍历、二叉树是否对称...

    #include//二叉树节点 typedef struct tree{ int data; struct tree *pLeft; struct tree *pRight; }Tree; //队列 ...

最新文章

  1. 萨默尔机器人_沣东新城王寺街道《民法典》企业宣传活动走进西安萨默尔科技...
  2. python装饰器原理-深刻理解python装饰器
  3. ntp服务器查看状态命令ntpstat及ntpq -p 说明及差别详解
  4. 【Codeforces 1096D】Easy Problem
  5. centos进程php-fpm,CentOS 6.x 开启Nginx和Php-fpm状态统计
  6. 在Python中最快的HTTP GET方法是什么?
  7. Python基础笔记(一)数据类型、变量、字符串
  8. ubuntu 环境变量配置
  9. JDK1.4下载 JRE1.4下载
  10. 转载:真正高人的解读——《三体 读后感》【宇宙尺度的战争】
  11. 算法精解 c语言 源码,算法精解七(C语言版)
  12. std::deque的使用
  13. C++ plus Primer 第六版中文版 带书签的 PDF
  14. 美团西安美食部分爬虫(修改版)(python)
  15. Mac 锁屏的各种方法
  16. Excel自动求和-乘法
  17. vue中nextTick的实际应用
  18. 笑话--老外与山东妞(爆笑)
  19. 无代码开发大众化,摆脱Excel轻松管理企业数据
  20. 马赛克,一生之敌,是时候说再见了【兄弟,借一部说话】

热门文章

  1. 获取指定存储过程的参数定义
  2. webmin账户重置密码
  3. 由System.getProperty(user.dir)引发的联想
  4. SocketFactory、DefaultSocketFactory、ServerSocketFactory、DefaultServerSocketFactory
  5. SQLite学习笔记(三)--创建内存数据库
  6. B/S应用中的ActiveX数字签名相关问题杂谈
  7. iPhone girl幕后推手浮出 制造者为论坛站长
  8. 软件_视频rtmp,rmvb,h265区别
  9. 指定jupyter运行的conda环境和报错处理generator_to_async_generator
  10. 都2020年了,你还认为BI=报表?