#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

二叉树路径应用举例(基于非递归后序遍历)相关推荐

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

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

  2. 二叉树非递归后序遍历算法的一种简单思路

    首先从简单的例子开始 1 2 3 上图二叉树的后序遍历序列是"231", 颠倒一下就是"132", 而其前序遍历是"123" 有什么发现? ...

  3. 非递归后序遍历二叉树总结(2种方法)

    算法 非递归后序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.04 传送门 非递归先序遍历二叉树 非递归中序遍历二叉树 方法1 非递归用栈来辅助遍历,后序遍历 ...

  4. 二叉树非递归后序遍历算法

    与正常的非递归中序遍历算法不同于两点: 一  比正常的中序遍历算法多了对数据元素的标记. 在压数据元素入栈(标记记为0,用来表示访问了其左子树)时标记, 还有访问完左子树利用gettop()获取双亲通 ...

  5. 二叉树的非递归后序遍历(双栈法和双指针法,有图有真相)

    一,前言 本文是原创作品,可能存在不足,欢迎大家指正,礼貌交流,感激不尽. 二,思路 二叉树后序遍历不同于前序遍历和中序遍历,后序遍历是三者之间最难的.下面就让我们来梳理一下代码的逻辑,看看如何轻松地 ...

  6. 二叉树非递归后序遍历

    /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *rig ...

  7. 二叉树非递归后序遍历的三种办法

    方法一: 双栈,利用生成先序序列思路,左--右依次入栈再出栈,得到头--右--左的序列,再将该序列入另一栈再出栈,得到左--右--头序列: void PostOrder_1(Bitree *T) {T ...

  8. 非递归先序遍历二叉树总结(3种方法)

    算法 非递归先序遍历二叉树总结(3种方法) @author:Jingdai @date:2020.12.03 传送门 非递归中序遍历二叉树 非递归后序遍历二叉树 递归先序遍历二叉树非常的简单,但是面试 ...

  9. 非递归中序遍历二叉树总结(2种方法)

    算法 非递归中序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.03 传送门 非递归先序遍历二叉树 非递归后序遍历二叉树 方法1 先序遍历是第一次遇到该节点遍历 ...

最新文章

  1. mysql存储过程不常用_Python--day46--mysql存储过程(不常用)(包含防sql注入)
  2. 零基础学编程学java还是python-小白学编程选java、php、前端还是python
  3. html section 布局,HTML:section标签
  4. java发送gmail_如何在Gmail中轻松通过电子邮件发送人群
  5. 建设数据中台之前,建议先看这份企业数据能力测评 | 大咖说中台
  6. 【Tomcat】初次配置Tomcat的那些糟心事
  7. 带进度条的文件复制。
  8. 知名电商“猝死”办公地人去楼空:不发货退款难 消费者被坑哭了
  9. JAVA GUI界面组件学习
  10. TypeScript学习笔记(二):基本数据类型及数据转换
  11. Async和Await简介
  12. 百度网盘资源转迅雷下载正确打开方式!
  13. 短视频视频数据分析 5个解析
  14. BottomNavigationView+ViewPager+Fragment 底部导航按钮
  15. 2020最新各大厂面试遇到的100道软件测试面试题+答案纯干货!! 金九银十到了 快点看!!!
  16. 多核时代多线程编程(一)基本策略
  17. java数字转汉字大写(全)
  18. 用鼠标模拟视线跟踪技术
  19. (二) 数据挖掘之分类
  20. SQL*Plus 系统变量之7 - BLO[CKTERMINATOR]

热门文章

  1. 云栖收官:想跟远道而来的朋友们说
  2. Serverless 工程实践 | 零基础上手 Knative 应用
  3. oracle 提取首字母,oracle 取字段文字拼音首字母
  4. git怎样用idea拉代码_一款强大的 IDEA 代码生成器,学会用,真香!
  5. php打印四行三列表格,php打印数组_php数组实例之表格状打印
  6. mysql5.7配置_MySQL5.7详细配置教程
  7. java 冒泡排序_Java冒泡排序详解
  8. 【完结】听完这12次分享,你应该完成了AI小白的蜕变
  9. 中国学前教育行业投资机会评估与运营展望规划报告2022版
  10. 全球及中国综艺节目产业营销策略分析及创新格局规划建议报告2021-2027年