二叉树的二叉链表存储表示如下

//二叉树的二叉链表存储表示
typedef struct BiTNode {
char data;//结点数据域
struct BiTNode* lchild, * rchild;//左右孩子指针
}*BiTree;

根据括号表示法的字符串创建树(括号里的表示括号前结点的子结点,‘,’号左边是左子结点,右边是右子结点)

比如:a(b(d,e),c(f,g(h,i)))

表示的则是

//创建树
void CreateBiTree(BiTree& T)
{
stack<BiTNode*> s;//用于确定需要操作的结点
BiTNode* p=NULL;
int i = 0;
bool child_Direct;//0表示左子结点,1表示右子结点
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
string TreeStr;
cin >> TreeStr;
while (TreeStr[i] != '\0') {
switch (TreeStr[i])
{
case'('://左子结点
s.push(p);
child_Direct = false;
break;
case')':
s.pop();
case','://右子结点
child_Direct = true;
break; default:
p = new BiTNode;
p->data = TreeStr[i];
p->lchild = p->rchild = NULL;
if (T == NULL)//若根节点为空则p指向根节点
T = p;
else {
if (!child_Direct)
s.top()->lchild = p;
else
s.top()->rchild = p;
}
break;
}
i++;
} }

  

非递归先序、中序、后序遍历

先序:

void PreOrderTraverse(BiTree T) {
stack<BiTNode*> s;
BiTNode* p = T, * q = new BiTNode();
while (p != NULL || !s.empty()) {
if (p)//p非空
{
cout << p->data;
s.push(p);//根指针入栈
p = p->lchild;//遍历左子树
}
else {
p = s.top();
s.pop();
p = p->rchild;//遍历右子树
}
}
}

  

中序:

//中序遍历
void InOrderTraverse(BiTree T) {
stack<BiTNode*> s;
BiTNode* p = T, * q = new BiTNode();
while (p != NULL || !s.empty()) {
if (p)//p非空
{
s.push(p);//根指针入栈
p = p->lchild;//遍历左子树
}
else {
p = s.top();
s.pop();
cout << p->data;
p = p->rchild;//遍历右子树
}
}
}

  

后序:

//后序遍历
void PostOrderTraverse(BiTree T) {
BiTNode* p = T, * r = NULL;
stack<BiTNode*> s;
while (p != NULL || !s.empty()) {
if (p != NULL) {//走到最左边
s.push(p);
p = p->lchild;
}
else {
p = s.top();
if (p->rchild != NULL && p->rchild != r)//右子树存在,未被访问
p = p->rchild;
else {
s.pop();
cout << p->data;
r = p;//记录最近访问过的节点
p = NULL;//节点访问完后,重置p指针
}
}//else
}//while }

完整代码

#include <iostream>
#include <stack>
#include <string>
using namespace std; //二叉树的二叉链表存储表示
typedef struct BiTNode {
char data;//结点数据域
struct BiTNode* lchild, * rchild;//左右孩子指针
}*BiTree; void Initial(BiTree& T) {
T = new BiTNode;
T = NULL;
}
//创建树
void CreateBiTree(BiTree& T)
{
stack<BiTNode*> s;//用于确定需要操作的结点
BiTNode* p=NULL;
int i = 0;
bool child_Direct;//0表示左子结点,1表示右子结点
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
string TreeStr;
cin >> TreeStr;
while (TreeStr[i] != '\0') {
switch (TreeStr[i])
{
case'('://左子结点
s.push(p);
child_Direct = false;
break;
case')':
s.pop();
case','://右子结点
child_Direct = true;
break; default:
p = new BiTNode;
p->data = TreeStr[i];
p->lchild = p->rchild = NULL;
if (T == NULL)//若根节点为空则p指向根节点
T = p;
else {
if (!child_Direct)
s.top()->lchild = p;
else
s.top()->rchild = p;
}
break;
}
i++;
} }
//以括号表示法输出二叉树
void DispBTNode(BiTNode *&b)
{
if (b != NULL)
{
cout<<b->data;
if (b->lchild != NULL || b->rchild != NULL)
{
cout<<"(";
DispBTNode(b->lchild);
if (b->rchild != NULL) cout<<(",");
DispBTNode(b->rchild);
cout<<")";
}
}
} #pragma region 递归遍历
//先序
void PreOrderTraverseR(BiTree T) {
if (T != NULL) {
cout << T->data;
PreOrderTraverseR(T->lchild);
PreOrderTraverseR(T->rchild);
}
}
//中序
void InOrderTraverseR(BiTree T) {
if (T != NULL) {
InOrderTraverseR(T->lchild);
cout << T->data;
InOrderTraverseR(T->rchild);
}
}
//后序
void PostOrderTraverseR(BiTree T) {
if (T != NULL) {
PostOrderTraverseR(T->lchild);
PostOrderTraverseR(T->rchild);
cout << T->data;
}
}
#pragma endregion #pragma region 非递归遍历
//先序遍历
void PreOrderTraverse(BiTree T) {
stack<BiTNode*> s;
BiTNode* p = T, * q = new BiTNode();
while (p != NULL || !s.empty()) {
if (p)//p非空
{
cout << p->data;
s.push(p);//根指针入栈
p = p->lchild;//遍历左子树
}
else {
p = s.top();
s.pop();
p = p->rchild;//遍历右子树
}
}
}
//中序遍历
void InOrderTraverse(BiTree T) {
stack<BiTNode*> s;
BiTNode* p = T, * q = new BiTNode();
while (p != NULL || !s.empty()) {
if (p)//p非空
{
s.push(p);//根指针入栈
p = p->lchild;//遍历左子树
}
else {
p = s.top();
s.pop();
cout << p->data;
p = p->rchild;//遍历右子树
}
}
}
//后序遍历
void PostOrderTraverse(BiTree T) {
BiTNode* p = T, * r = NULL;
stack<BiTNode*> s;
while (p != NULL || !s.empty()) {
if (p != NULL) {//走到最左边
s.push(p);
p = p->lchild;
}
else {
p = s.top();
if (p->rchild != NULL && p->rchild != r)//右子树存在,未被访问
p = p->rchild;
else {
s.pop();
cout << p->data;
r = p;//记录最近访问过的节点
p = NULL;//节点访问完后,重置p指针
}
}//else
}//while }
#pragma endregion
int main()
{
BiTree b;
Initial(b);
//创建树
CreateBiTree(b);
//先序遍历
cout << "先序遍历:";
PreOrderTraverse(b);
cout << endl;
//中序遍历
cout << "中序遍历:";
InOrderTraverse(b);
cout << endl;
//后序遍历
cout << "后序遍历:";
PostOrderTraverse(b);
}

  

程序示例:

C++学习---二叉树的输入及非递归遍历的更多相关文章

  1. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  2. C++编程练习(17)----“二叉树非递归遍历的实现“

    二叉树的非递归遍历 最近看书上说道要掌握二叉树遍历的6种编写方式,之前只用递归方式编写过,这次就用非递归方式编写试一试. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历 ...

  3. ZT 二叉树的非递归遍历

    ZT 二叉树的非递归遍历 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就 是递归定 ...

  4. c语言描述的二叉树的基本操作(层序遍历,递归,非递归遍历)

    #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define ...

  5. 数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)

    Nonrecursive Traversal of Binary Tree First I wanna talk about why we should <code>Stack</c ...

  6. [Alg] 二叉树的非递归遍历

    1. 非递归遍历二叉树算法 (使用stack) 以非递归方式对二叉树进行遍历的算法需要借助一个栈来存放访问过得节点. (1) 前序遍历 从整棵树的根节点开始,对于任意节点V,访问节点V并将节点V入栈, ...

  7. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  8. c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)

    二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...

  9. JAVA递归、非递归遍历二叉树(转)

    原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...

随机推荐

  1. JDK15正式发布,新增功能预览!

    JDK 15 在 2020 年 9 月 15 号正式发布了,这次发布的主要功能有: JEP 339:EdDSA 数字签名算法 JEP 360:密封类(预览) JEP 371:隐藏类 JEP 372:删 ...

  2. k8s健康检查(七)

    默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness ...

  3. 1000000 / 60S 的 RocketMQ 不停机,扩容,平滑升级!

    一.背景 1.各业务系统持续迭代过程中,JDK.SpringBoot.RocketMQ Client 等框架也进行了升级,高版本的 RocketMQ Client 发送的消息到低版本中,在控制台中午无 ...

  4. Vue 3.0 来了,我们该做些什么?

    靓仔路过,不要错过 想必 Vue3.0 发布这件事,大家都知道了. 我也是从朋友圈的转发得知此事,博客平台.公众号.朋友圈基本都有这么一条新闻,可见 Vue3.0 的被期待程度,因为 React 16 ...

  5. get 跟post的区别

    get参数通过url传递,post放在request body中 :get请求在url中传递的参数是有长度限制的,而post没有.

  6. 在 Kubernetes 上部署 OpenStack 是什么体验

    红蓝出 CP,OpenStack 和 Kubernetes 在一起会怎样? 背景 从去年开始就想深入地学习 Kubernetes,首先想到是在 OpenStack 上能比较轻松地玩转,所以去 尝试了 ...

  7. Windows10下JDK8的下载安装与环境变量的配置

    Windows10下JDK8的下载安装与环境变量的配置 下载JDK8(64位) 链接:https://pan.baidu.com/s/10ZMK7NB68kPORZsPOhivog 提取码:agsa ...

  8. html 背景花瓣特效--1

    html背景樱花可以用js添加,将<script>标签复制到<body>标签下就可以,javascript脚本点击 <!DOCTYPE html> <html ...

  9. VSCode搭建golang环境

    安装对应版本的Golang 略 VSCode安装对应 Go 插件 在应用商店安装即可:go VSCode安装 Go 工具: 在VSCode输入:Crtl + Shift + P 在弹出框输入:inst ...

  10. C#实例(经典):四路光电开关&激光雷达数据采集和波形图绘制

    前言:本文全部纯手工打造,如有疏漏之处,还请谅解! 如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! ! 这 ...