数据结构与算法-二叉树遍历
- 广度优先遍历
//广度优先遍历
void breadthFirst(Node* &bt){queue<Node*> que;Node* BT = bt;que.push(BT);while (!que.empty()){BT = que.front();que.pop();printf("%c", BT->data);if (BT->lchild)que.push(BT->lchild);if (BT->rchild)que.push(BT->rchild);}
}复制代码
- 深度优先遍历
- V-访问节点
- L-遍历左子树
- R-遍历右子树
//从左向右前中后递归遍历
void leftPreOrder(Node *bt)
{if (bt){printf("%c", bt->data);leftPreOrder(bt->lchild);leftPreOrder(bt->rchild);}
}void leftInOrder(Node *bt)
{if (bt){leftInOrder(bt->lchild);printf("%c", bt->data);leftInOrder(bt->rchild);}
}void leftPostOrder(Node *bt)
{if (bt){leftPostOrder(bt->lchild);leftPostOrder(bt->rchild);printf("%c", bt->data);}
}复制代码
节点定义:typedef struct BiNode{int data;struct BiNode * lchild;struct BiNode * rchild;
}BiNode,*BiTree;前序遍历:void preOrderBiTree(BiNode * root){if(root == NULL)return;BiNode * node = root;stack<BiNode*> nodes;while(node || !nodes.empty()){while(node != NULL){nodes.push(node);printf("%d",node->data);node = node -> lchild;}node = nodes.top();//回溯到父节点nodes.pop();node = node -> rchild;}
}复制代码
void inOrderBinaryTree(BiNode * root){if(root == NULL)return;BiNode * node = root;stack<BiNode*> nodes;while(node || !nodes.empty()){while(node != NULL){nodes.push(node);node = node ->lchild;}node = nodes.top();printf("%d ",node ->data);nodes.pop();node = node ->rchild;}
}复制代码
void PostOrderS(Node *root) {Node *p = root, *r = NULL;stack<Node*> s;while (p!=NULL || !s.empty()) {if (p!=NULL) {//走到最左边s.push(p);p = p->left;}else {p = s.top();if (p->right!=NULL && p->right != r)//右子树存在,未被访问p = p->right;else {s.pop();visit(p->val);r = p;//记录最近访问过的节点p = NULL;//节点访问完后,重置p指针}}//else}//while
}复制代码
/*二叉树节点*/
typedef struct node
{char data;struct node *lchild, *rchild;
}Node;/*二叉树栈*/
typedef struct
{int top;//指向二叉树节点指针的指针struct node* data[MAX];bool isNode[MAX];
}SqStack;void push(SqStack *&s, Node *bt, bool isNode = true)
{if (s == NULL)return;if (s->top == MAX - 1){printf("栈满,不能再入栈");}else{s->top++;s->data[s->top] = bt;s->isNode[s->top] = isNode;}
}Node* pop(SqStack *&s)
{if (s->top == -1){printf("栈空,不能出栈");}else{Node* temp;temp = s->data[s->top];s->top--;return temp;}
}bool topIsNode(SqStack *&s){if (s->top != -1)return s->isNode[s->top];return false;
}//从左向右前中后非递归遍历
void leftPreOrder(Node *bt)
{Node *BT = bt;bool isNode = false;push(s, BT, isNode);while (!EmptyStack(s)){isNode = topIsNode(s);BT = pop(s);if (isNode){printf("%c", BT->data);}else{if (BT->rchild != NULL)push(s, BT->rchild, false);if (BT->lchild != NULL)push(s, BT->lchild, false);push(s, BT, true);} }
}void leftSimPreOrder(Node *bt)
{Node *BT = bt;push(s, BT);while (!EmptyStack(s)){BT = pop(s);printf("%c", BT->data);if (BT->rchild != NULL)push(s, BT->rchild);if (BT->lchild != NULL)push(s, BT->lchild);}
}void leftInOrder(Node *bt)
{Node *BT = bt;bool isNode = false;push(s, BT, isNode);while (!EmptyStack(s)){isNode = topIsNode(s);BT = pop(s);if (isNode){printf("%c", BT->data);}else{if (BT->rchild != NULL)push(s, BT->rchild, false);push(s, BT, true);if (BT->lchild != NULL)push(s, BT->lchild, false);}}
}void leftPostOrder(Node *bt)
{Node *BT = bt;bool isNode = false;push(s, BT, isNode);while (!EmptyStack(s)){isNode = topIsNode(s);BT = pop(s);if (isNode){printf("%c", BT->data);}else{push(s, BT, true);if (BT->rchild != NULL)push(s, BT->rchild, false);if (BT->lchild != NULL)push(s, BT->lchild, false);}}
}复制代码
数据结构与算法-二叉查找树
数据结构与算法-二叉树遍历相关推荐
- javascript数据结构与算法--二叉树遍历(中序)
javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /**二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中*** ...
- 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)
zsychanpin 博客园 首页 新随笔 联系 订阅 管理 树的基本概念和遍历规则 树的递归定义 树是n(n>0)个结点的有限集,这个集合满足下面条件: ⑴有且仅有一个结点没有前驱 ...
- 数据结构与算法-- 二叉树后续遍历序列校验
二叉树后续遍历序列校验 题目:输入一个整数数组,判断改数组是否是某个二叉搜索树的后续遍历结果,如果是返回true否则false,假设输入数组的任意两个数字不相同. 例如输入{5,7,6,9,11,10 ...
- 数据结构与算法--二叉树第k个大的节点
二叉树第k个大的节点 二叉树文章列表: 数据结构与算法–面试必问AVL树原理及实现 数据结构与算法–二叉树的深度问题 数据结构与算法–二叉堆(最大堆,最小堆)实现及原理 数据结构与算法–二叉查找树转顺 ...
- 数据结构与算法-- 二叉树中和为某一值的路径
二叉树中和为某一值的路径 题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为给定值的所有路径.从树的根节点开始往下一只到叶子节点所经过的节点形成一条路径. 我们用二叉树节点的定义沿用之前文章中 ...
- 常考数据结构与算法:二叉树的之字形层序遍历
题目描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树之字形层序遍历的结果是 [ ...
- 数据结构与算法 -- 二叉树 ADT
树的类型有很多,这里我们只讲二叉树. 一.二叉树的基本概念 1.什么是二叉树 在计算机科中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"和"右子树&q ...
- 数据结构与算法--二叉树的深度问题
二叉树的深度 题目:输入一颗二叉树的根,求该树的深度.从根节点到叶子节点一次进过的节点形成的一条路径,最长的路径的长度为树的深度. 如下图中二叉树的额深度4,因为从根节点A到叶子节点的路径中有4个节点 ...
- 数据结构与算法--二叉树实现原理
二叉树 二叉树(binary tree)是一棵树,其中每个节点都不能有多于两个的子节点 二叉树的一个性质是一颗平均二叉树的深度要比节点个数N小得多(重点),对二叉树的分析得出其平均深度为O(N\sqr ...
- 数据结构与算法 | 二叉树四种的遍历方法(递归与非递归)
二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树的所有节点,使得每个节点被访问且只访问一次. 而一般有四种遍历方法: 前序.中序.后序.层序,下面就分别讲一下四个遍历的思路以及代码实现 例如我 ...
最新文章
- 快速排序C实现(阿里巴巴 2012年全国校招笔试题)
- 在Asp.Net MVC中使用ModelBinding构造Array、List、Collection以及Dictionary
- 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”...
- php在函数内使用全局变量
- Java中的ThreadPoolExecutor类
- php的excel源码下载,PHPExcel-5 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...
- python的gui界面 可视化_使用可视化设计窗体的GUI程序
- 字符串经典题之扑克牌的大小
- 响应式禁用(Bootstrap PK AmazeUI)
- 工作学习资料备份记录
- 微信抢红包代码 python_python实现红包裂变算法
- python有多少个模块_python绘图模块有哪些
- iOSQuartz2D-04-手动剪裁图片并保存到相册
- 移卡旗下全新餐饮SaaS产品米粒餐收银发布 科技驱动零售餐饮业态场景创新
- Vs2010中文版安装silverlight5bate方法
- Promise初步详解(resolve,reject,catch)
- 躲在被窝里偷偷学爬虫(6)---处理cookie模拟登录及代理IP
- unity开发 宝箱掉落与产出
- 【c语言】printf和scanf中* # %g的作用
- 小红书笔记发布软件 批量上传视频
热门文章
- Atitit 时间的展示格式与存储格式 目录 1.1. 赛事时间的格式起源	1 1.1.1. 六十[编辑]	1 1.2. 1h 12m 23s 模式 (可读性最好	2 1.3. 日常模式 1:45:
- Atitit word结构化提取考试试题读取 poi读取word nlp aiprj 目录 1.1. 结构化后数据	1 1.2. 文字读取	1 1.3. 图片读取	1 1.4. Doc的表格读取 /
- Atitit maven配置pom文件 配置法v2 t33 目录 1. Maven打包war原理	1 1.1. 在target目录生成war包ori目录。。。里面就是所有的资源	1 1.2. 去掉
- atitit.错误:找不到或无法加载主类 的解决 v4 qa15.doc 艾提拉总结 attilax总结 1.1. 修改此java文件,让他启动编译,还是不能生成了新的class,	1 1.2. 查
- Atitit 引流矩阵与矩阵引流 推广方法 attilax总结
- Atitit Atitit 零食erp数据管理---世界著名零食系列数据.docx世界著名零食
- Atitit数据库层次架构表与知识点 attilax 总结
- 屏幕取词技术实现原理
- atitit.提升兼容性最佳实践 o9o
- paip.java 架构师之路以及java高级技术