二叉树路径应用举例(基于非递归后序遍历)
#include "stdafx.h" #include <iostream> #include <fstream>using namespace std;typedef struct _Node {int data;struct _Node *left;struct _Node *right;bool isVisit; //后序遍历标志(非递归) _Node(){data = 0;left = NULL;right = NULL;isVisit = false;} }Node, *_PNode;#define MAXSIZE 100//创建二叉树利用先序创建 /*1/ \2 3/ \ / 4 3 6/ \ \ / \7 8 9 10 11/ \12 13/14*/ void CreateBitree(_PNode &pNode, fstream &fin) {int dat;fin>>dat;if(dat==0){pNode = NULL;}else {pNode = new Node();pNode->data=dat; CreateBitree(pNode->left, fin); CreateBitree(pNode->right, fin);} }//***********************二叉树路径应用举例(基于非递归后序遍历)***************************begin//求根节点到所有叶子结点的路径 void FindAllRootToLeafPath(_PNode pRoot) {_PNode pTree = pRoot;_PNode s[MAXSIZE];int top = 0;while (top > 0 || NULL != pTree){while (NULL != pTree){if (NULL == pTree->left && NULL == pTree->right){for (int i = 1; i <= top; i++){cout<<s[i]->data<<" ";}cout<<pTree->data<<" "<<endl;}s[++top] = pTree;pTree = pTree->left;}if (top > 0){pTree = s[top];if (pTree->isVisit){top--;pTree = NULL;}else{pTree->isVisit = true;pTree = pTree->right;}}} }//求根节点到指定结点的路径 void FindRootToNodePath(_PNode pRoot, int key) {_PNode pTree = pRoot;_PNode s[MAXSIZE];int top = 0;while (top > 0 || NULL != pTree){while (NULL != pTree){if (pTree->data == key){for (int i = 1; i <= top; i++){cout<<s[i]->data<<" ";}cout<<pTree->data<<" "<<endl;}s[++top] = pTree;pTree = pTree->left;}if (top > 0){pTree = s[top];if (pTree->isVisit){top--;pTree = NULL;}else{pTree->isVisit = true;pTree = pTree->right;}}} }//求二叉树第一条最长的路径长度 void FindLongestPath(_PNode pRoot) {_PNode pTree = pRoot;_PNode s[MAXSIZE] = {0};_PNode tmp[MAXSIZE] = {0}; //存放最长路径int top = 0;int longest = 0;while (top > 0 || NULL != pTree){while (NULL != pTree){s[++top] = pTree;pTree = pTree->left;}if (top > 0){pTree = s[top];if (pTree->isVisit){if (top > longest){longest = top;for (int i = 1; i <= top; i++){tmp[i] = s[i];}}top--;pTree = NULL;}else{pTree->isVisit = true;pTree = pTree->right;}}}for (int i = 1; i <= longest; i++){cout<<tmp[i]->data<<" ";} }//设置后序访问标志为未访问,即false void SetVisitFalse(_PNode pRoot) {if (NULL != pRoot){pRoot->isVisit = false;SetVisitFalse(pRoot->left);SetVisitFalse(pRoot->right);} }//***********************二叉树路径应用举例(基于非递归后序遍历)***************************endint _tmain(int argc, _TCHAR* argv[]) {fstream fin("tree.txt");_PNode pRoot = NULL;CreateBitree(pRoot, fin);SetVisitFalse(pRoot);cout<<"********************求根节点到所有叶子结点的路径***********************"<<endl;FindAllRootToLeafPath(pRoot);SetVisitFalse(pRoot);cout<<"********************求二叉树第一条最长的路径长度***********************"<<endl;FindLongestPath(pRoot);SetVisitFalse(pRoot);cout<<endl<<"*********************求根节点到指定结点的路径**************************"<<endl;FindRootToNodePath(pRoot, 13); //根结点到值为13的结点的路径 cout<<endl;return 0; }
运行界面如下:
建造二叉树的tree.txt文件如下:
1 2 4 7 12 0 0 0 8 0 13 14 0 0 0 3 0 9 0 0 3 6 10 0 0 11 0 0 0
转载于:https://www.cnblogs.com/venow/archive/2012/08/24/2653969.html
二叉树路径应用举例(基于非递归后序遍历)相关推荐
- 二叉树非递归后序遍历算法(C语言)
二叉树非递归后序遍历算法(C语言) 二叉树后序遍历的规律:左右根 后序非递归遍历中,访问根(子根)结点有两种情况 ①:遍历完左子树,需要遍历右子树,需要从栈中访问最顶上的根(子根)结点从而得到右子树的 ...
- 二叉树非递归后序遍历算法的一种简单思路
首先从简单的例子开始 1 2 3 上图二叉树的后序遍历序列是"231", 颠倒一下就是"132", 而其前序遍历是"123" 有什么发现? ...
- 非递归后序遍历二叉树总结(2种方法)
算法 非递归后序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.04 传送门 非递归先序遍历二叉树 非递归中序遍历二叉树 方法1 非递归用栈来辅助遍历,后序遍历 ...
- 二叉树非递归后序遍历算法
与正常的非递归中序遍历算法不同于两点: 一 比正常的中序遍历算法多了对数据元素的标记. 在压数据元素入栈(标记记为0,用来表示访问了其左子树)时标记, 还有访问完左子树利用gettop()获取双亲通 ...
- 二叉树的非递归后序遍历(双栈法和双指针法,有图有真相)
一,前言 本文是原创作品,可能存在不足,欢迎大家指正,礼貌交流,感激不尽. 二,思路 二叉树后序遍历不同于前序遍历和中序遍历,后序遍历是三者之间最难的.下面就让我们来梳理一下代码的逻辑,看看如何轻松地 ...
- 二叉树非递归后序遍历
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *rig ...
- 二叉树非递归后序遍历的三种办法
方法一: 双栈,利用生成先序序列思路,左--右依次入栈再出栈,得到头--右--左的序列,再将该序列入另一栈再出栈,得到左--右--头序列: void PostOrder_1(Bitree *T) {T ...
- 非递归先序遍历二叉树总结(3种方法)
算法 非递归先序遍历二叉树总结(3种方法) @author:Jingdai @date:2020.12.03 传送门 非递归中序遍历二叉树 非递归后序遍历二叉树 递归先序遍历二叉树非常的简单,但是面试 ...
- 非递归中序遍历二叉树总结(2种方法)
算法 非递归中序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.03 传送门 非递归先序遍历二叉树 非递归后序遍历二叉树 方法1 先序遍历是第一次遇到该节点遍历 ...
最新文章
- mysql存储过程不常用_Python--day46--mysql存储过程(不常用)(包含防sql注入)
- 零基础学编程学java还是python-小白学编程选java、php、前端还是python
- html section 布局,HTML:section标签
- java发送gmail_如何在Gmail中轻松通过电子邮件发送人群
- 建设数据中台之前,建议先看这份企业数据能力测评 | 大咖说中台
- 【Tomcat】初次配置Tomcat的那些糟心事
- 带进度条的文件复制。
- 知名电商“猝死”办公地人去楼空:不发货退款难 消费者被坑哭了
- JAVA GUI界面组件学习
- TypeScript学习笔记(二):基本数据类型及数据转换
- Async和Await简介
- 百度网盘资源转迅雷下载正确打开方式!
- 短视频视频数据分析 5个解析
- BottomNavigationView+ViewPager+Fragment 底部导航按钮
- 2020最新各大厂面试遇到的100道软件测试面试题+答案纯干货!! 金九银十到了 快点看!!!
- 多核时代多线程编程(一)基本策略
- java数字转汉字大写(全)
- 用鼠标模拟视线跟踪技术
- (二) 数据挖掘之分类
- SQL*Plus 系统变量之7 - BLO[CKTERMINATOR]
热门文章
- 云栖收官:想跟远道而来的朋友们说
- Serverless 工程实践 | 零基础上手 Knative 应用
- oracle 提取首字母,oracle 取字段文字拼音首字母
- git怎样用idea拉代码_一款强大的 IDEA 代码生成器,学会用,真香!
- php打印四行三列表格,php打印数组_php数组实例之表格状打印
- mysql5.7配置_MySQL5.7详细配置教程
- java 冒泡排序_Java冒泡排序详解
- 【完结】听完这12次分享,你应该完成了AI小白的蜕变
- 中国学前教育行业投资机会评估与运营展望规划报告2022版
- 全球及中国综艺节目产业营销策略分析及创新格局规划建议报告2021-2027年