【C++】二叉树的先序、中序、后序遍历序列

news/2024/7/8 6:43:27

二叉树常用到的遍历有这三种

先序遍历:先遍历根节点,然后再分别遍历左节点和右节点。(根左右)

中序遍历:先遍历左节点,然后再遍历根节点,最后遍历右节点。(左根右)

后序遍历:先遍历左节点,然后再遍历右节点,最后遍历根节点。(左右根)

如下图所示:

按照中序遍历的打印顺序为:D B E A F C G

按照先序遍历的打印顺序为:A B D E C F G

按照后序遍历的打印顺序为:D E B  F  G  C  A

我们先来看一下关于二叉树的创建:

先来看关于二叉树中指针的指向的创建:

typedef class BtNode
{
public:char data;  //数据struct BtNode* leftchild; //左孩子struct BtNode* rightchild;//右孩子
}BtNode, * BiaryTree;

二叉树的构建:

BtNode* CreatTree()
{BtNode* s = NULL;char elem;  //输入想进行中序,前序或后序遍历的二叉树节点cin >> elem;if (elem != '#')   //此处#代表孩子节点为NULL{s = BuyNode();s->data = elem;s->leftchild = CreatTree();s->rightchild = CreatTree();}return s;
}

二叉树创建中使用到的BuyNode()函数

BtNode* BuyNode()
{BtNode* s = (BtNode*)malloc(sizeof(BtNode));if (NULL == s) exit(1);memset(s, 0, sizeof(BtNode));return s;
}

实现上述三种遍历的代码:

递归版本的三种遍历方法

        递归实现中序遍历:

void InOrder(BtNode* ptr)
{if (ptr != nullptr){InOrder(ptr->leftchild);cout << ptr->data << "  ";InOrder(ptr->rightchild);}
}

        递归实现前序遍历:

void PreOrder(BtNode* ptr)
{if (ptr != nullptr){cout << ptr->data << "  ";PreOrder(ptr->leftchild);PreOrder(ptr->rightchild);}
}

        递归实现后续遍历:

void PassOrder(BtNode* ptr)   //
{if (ptr != nullptr){PassOrder(ptr->leftchild);PassOrder(ptr->rightchild);cout << ptr->data << "   ";}
}

上述代码详解:(下图以中序遍历来举例,前序和后续类似)

 非递归版本的三种遍历:

中序遍历:

void NiceInorder(BtNode* ptr)
{if (ptr == NULL) return;std::stack<BtNode*> st;while (ptr != NULL || !st.empty()){while (ptr != NULL){st.push(ptr);ptr = ptr->leftchild;}ptr = st.top(); st.pop();cout << ptr->data;ptr = ptr->rightchild;}cout << endl;
}

后序遍历:

void NicepastOrder(BtNode* ptr)
{if (ptr == NULL) return;std::stack<BtNode*> st;BtNode* tag = NULL;   //tag指针相当于一个跟屁虫  你访问过那个指针 我就指向哪个指针while (ptr != NULL || !st.empty())   //剩下的思路和中序遍历几乎一毛一样{while (ptr != NULL){st.push(ptr);ptr = ptr->leftchild;}ptr = st.top();st.pop();if (ptr->rightchild == NULL || ptr->rightchild == tag){cout << ptr->data;tag = ptr;ptr = NULL;}else{st.push(ptr);ptr = ptr->rightchild;}}cout << endl;
}

非递归中序遍历的代码详解 (思路类似,对照着看,可以看明白的):

 

"多看多敲就可以变强(当然也可以变秃)"

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

软件工程需求设计说明书

Java即时通聊天程序 设计需求说明书 专业班级&#xff1a; 计本班1202班 项目组成员&#xff1a; 杨宗坤 刘瑞 满亚洲 指导教师&#xff1a; 张利峰 开始日期&#xff1a; 完成日期&#xff1a; 编写目的&#xff1a; 本说明书是在充分理解系统需求分析…

【C++】菱形继承

我们先来看下菱形继承的基本视图以及基本的代码结构 下面来看下简单的代码以及数据结构&#xff1a; class Person { public:int a_p; };class Studen :public Person { public:int a_st; };class Stuff :public Person { public:int a_sf; };class st_sf :public Stuff, publ…

ie旋转滤镜Matrix

旋转一个元素算是一个比较常见的需求了吧&#xff0c;在支持CSS3的浏览器中可以使用transform很容易地实现&#xff0c;这里有介绍&#xff1a;http://www.css88.com/archives/2168&#xff0c;这里有演示http://www.css88.com/tool/css3Preview/Transform.html&#xff0c;就不…

【C++】四种类型的转换

C四种类型的转换 包括这四种&#xff1a;const_cast , static_cast , dynamic_cast , reinterpret_cast 先来说下C语言中的类型转换&#xff0c;非常的暴力&#xff0c;就是耍流氓&#xff1a; float a 12.23; int b (int)a; 下面我写的都是最基础的&#xff0c;简单的&am…

【C++】满二叉树、完全二叉树等概念解释

二叉树中的判断有以下几种&#xff1a; 是否完全二叉树、是否满二叉树、是否为BST树、是否为平衡二叉树、是否为对称二叉树、完美二叉树 满二叉树&#xff1a; 除最后一层无任何子节点外&#xff0c;每一层上的所有结点都有两个子结点的二叉树。 上述所示图除最外一层节点之外…

【C++】多线程(链式、循环队列)实现生产者消费者模式

生产者消费者模式&#xff1a; 生产者消费者问题&#xff08;英语&#xff1a;Producer-consumer problem&#xff09;&#xff0c;也称有限缓冲问题&#xff08;英语&#xff1a;Bounded-buffer problem&#xff09;&#xff0c;是一个多线程同步问题的经典案例。该问题描述了…

添加引用方式抛出和捕获干净的WebService异常

转载&#xff1a;http://www.cnblogs.com/ahdung/p/3953431.html 说明&#xff1a;【干净】指的是客户端在捕获WebService&#xff08;下称WS&#xff09;抛出的异常时&#xff0c;得到的ex.Message就是WS方法中抛出的异常消息&#xff0c;不含任何“杂质”。 前提&#xff1a;…

基数排序(桶排序)

基数排序又叫桶排序&#xff1a; 先按照个位数排序&#xff0c;第一次排序好之后&#xff1b;再次按照十位数进行排序&#xff0c;第二次排序好之后&#xff1b;第三次对百位进行排序.................. 实现原理图&#xff1a;拿出一些个类似“桶”的东西 将分别按照个位&am…