1.打印值为x的结点的所有祖先

栈从0开始,top初始值-1

#include "stdafx.h"
#include<iostream>
using namespace std;
typedef struct BTreeNode
{int data;struct BTreeNode *lchild,*rchild;
}BTree;
typedef struct stacknode
{BTree *node;int tag;//tag为0表示结点左子女已经访问,为1表示右子女已经访问
}stack;
int _tmain(int argc, _TCHAR* argv[])
{return 0;
}
void Search(BTree *b,int x)
{stack s[100];int top=-1;stack temp;//暂存结点信息while(b||top>-1){while(b){temp.node=b;temp.tag=0;//左结点已访问s[++top]=temp;b=b->lchild;}//以下为功能代码if(b->data==x){printf("所查结点的所有祖先为:\n");for(int i=0;i<=top;i++){cout<<s[i].node->data;}exit(0);//输出完成后退出程序}while(top&&s[top].tag==1){ //表示右子树访问完毕,所以访问根节点  //b = s[top --].node;//cout << b->val << ' ';/*之前是写这两行,但是会导致最后top为0时,p非空,所以会不断循环最外层的while(p||top)如果要写这两行而不写下面那句的话,要采用do{}while(top);*/cout << s[top --].node->data<< ' ';}if(top!=-1){s[top].tag= 1; //右结点已访问           b = s[top].node;           b = b->rchild;}}
}

2.p,q最近公共祖先

#include "stdafx.h"
#include<iostream>
using namespace std;
typedef struct BTreeNode
{int data;struct BTreeNode *lchild,*rchild;
}BTree;
typedef struct stacknode
{BTree *node;int tag;//tag为0表示结点左子女已经访问,为1表示右子女已经访问
}stack;
int _tmain(int argc, _TCHAR* argv[])
{return 0;
}
BTree *Ancestor(BTree *b,BTree *p,BTree *q,BTree *r)
{stack s[100],s1[100];//辅助栈int top=-1,top1=-1;stack temp;//暂存结点信息while(b||top>-1){while(b){temp.node=b;temp.tag=0;//左结点已访问s[++top]=temp;b=b->lchild;}//以下为功能代码if(b==p)//不失一般性,设p在q的左边,所以p必定先于q被访问,把栈中已有元素复制到另一栈中去{for(int i=0;i<=top;i++){s1[i]=s[i];}top1=top;}if(b==q)//找到q{for(int i=top;i>=0;i--)//将栈中元素的树结点到s1中去匹配{BTree *pp=s[i].node;for(int j=top1;j>=0;j--){if(s1[j].node==pp)return pp;}}}while(top&&s[top].tag==1){ //表示右子树访问完毕,所以访问根节点  //b = s[top --].node;//cout << b->val << ' ';/*之前是写这两行,但是会导致最后top为0时,p非空,所以会不断循环最外层的while(p||top)如果要写这两行而不写下面那句的话,要采用do{}while(top);*/cout << s[top --].node->data<< ' ';}if(top!=-1){s[top].tag= 1; //右结点已访问           b = s[top].node;           b = b->rchild;}}
}

3.到叶结点的路径

#include "stdafx.h"
#include<iostream>
using namespace std;
typedef struct BTreeNode
{int data;struct BTreeNode *lchild,*rchild;
}BTree;
typedef struct stacknode
{BTree *node;int tag;//tag为0表示结点左子女已经访问,为1表示右子女已经访问
}stack;
int _tmain(int argc, _TCHAR* argv[])
{return 0;
}
BTree *Ancestor(BTree *b,BTree *p,BTree *q,BTree *r)
{stack s[100],s1[100];//辅助栈int top=-1,top1=-1;stack temp;//暂存结点信息while(b||top>-1){while(b){temp.node=b;temp.tag=0;//左结点已访问s[++top]=temp;b=b->lchild;}//以下为功能代码if(b->lchild!=NULL&&b->rchild!=NULL){for(int i=0;i<=top;i++){cout<<s[i].node->data;}cout<<b->data;}while(top&&s[top].tag==1){ //表示右子树访问完毕,所以访问根节点  //b = s[top --].node;//cout << b->val << ' ';/*之前是写这两行,但是会导致最后top为0时,p非空,所以会不断循环最外层的while(p||top)如果要写这两行而不写下面那句的话,要采用do{}while(top);*/cout << s[top --].node->data<< ' ';}if(top!=-1){s[top].tag= 1; //右结点已访问           b = s[top].node;           b = b->rchild;}}
}

4.根节点到叶结点最长路径

#include "stdafx.h"
#include<iostream>
using namespace std;
typedef struct BTreeNode
{int data;struct BTreeNode *lchild,*rchild;
}BTree;
typedef struct stacknode
{BTree *node;int tag;//tag为0表示结点左子女已经访问,为1表示右子女已经访问
}stack;
int _tmain(int argc, _TCHAR* argv[])
{return 0;
}
BTree *Ancestor(BTree *b,BTree *p,BTree *q,BTree *r)
{stack s[100],l[100];//辅助栈int top=-1,top1=-1,longest=0;stack temp;//暂存结点信息while(b||top>-1){while(b){temp.node=b;temp.tag=0;//左结点已访问s[++top]=temp;b=b->lchild;}//以下为功能代码if(s[top].tag==1)//右结点已访问  {if(s[top].node->lchild&&s[top].node->rchild){if(top>longest){for(int i=0;i<=top;i++){l[i]=s[i];//保存栈中结点}longest=top;top--;//出栈}}}while(top&&s[top].tag==1){ //表示右子树访问完毕,所以访问根节点  //b = s[top --].node;//cout << b->val << ' ';/*之前是写这两行,但是会导致最后top为0时,p非空,所以会不断循环最外层的while(p||top)如果要写这两行而不写下面那句的话,要采用do{}while(top);*/cout << s[top --].node->data<< ' ';}if(top!=-1){s[top].tag= 1; //右结点已访问           b = s[top].node;           b = b->rchild;}}
}

转载于:https://www.cnblogs.com/tgkx1054/archive/2012/08/10/2633157.html

后序非递归遍历二叉树的应用相关推荐

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

    后序遍历的顺序是左.右.根.而前序遍历的顺序是根.左.右.所以只需将前序遍历稍作改变,变成先遍历根再遍历右最后遍历左即(根右左)就会发现此时的顺序便是后序遍历的倒序了,所以这时候只需将改变后的前序遍历 ...

  2. 二叉树的后序非递归遍历(巧妙思想)

    大家都知道二叉树的前序非递归遍历非常好写: //二叉树的结构 public class TreeNode {TreeNode left;TreeNode right;int val;TreeNode( ...

  3. 数据结构专题 | 先序非递归遍历二叉树

    先序非递归遍历二叉树,主要是利用了栈的先进后出原理,用一个栈即可实现该算法,下面我们一起来看一下如何来实现吧 目录 先序建立二叉树 先序递归遍历二叉树 先序非递归遍历二叉树 先序建立二叉树 在进行先序 ...

  4. 中序非递归遍历二叉树

    二叉树的递归算法虽然简单,但是会导致时间复杂度比较高,下面给大家带来用栈实现的二叉树非递归算法 首先定义好二叉树,和元素类型为二叉树的栈 typedef struct BiTNode{TElemTyp ...

  5. C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历)

     二叉树的非递归遍历C/C++实现:   非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历struct tree* t ...

  6. 二叉树的前序、中序、后序非递归遍历 python实现

    前言 python中二叉树的定义: class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = None ...

  7. 【我的算法笔记】后序非递归遍历模板及其应用

    目录 前言 非递归后序遍历算法模板 求树的深度 打印值为x的节点的所有祖先 求节点t,s最近公共祖先节点 输出从每个叶子节点到根节点的逆路径 前言 本篇文章主要介绍非递归后序遍历的算法,并且在这个算法 ...

  8. 数据结构: 中序非递归遍历二叉树

    status InOrderTraverse(BiTree T,status (*visit)(TElementType e) { InitStack(s); p=T; while(p||!Stack ...

  9. 二叉树的前、中、后的非递归遍历

    题目 实现一个链式存储的二叉树,采用非递归的形式,按照前.中.后序的顺序遍历二叉树. 代码 /** * 二叉树的前.中.后序的非递归遍历 **/#include <iostream> us ...

最新文章

  1. 阿里面试官:接口的幂等性怎么设计?
  2. power design教程
  3. 使用Custom.pll修改标准Form的LOV
  4. 成员变量隐藏c语言,C语言中隐藏结构体的细节
  5. BurpSuite下载CA证书
  6. Forget Yourself
  7. 空间点与直线距离算法
  8. 关于windriver WD_NO_LICENSE错误和解决办法
  9. AT91SAM9260开发板
  10. AGV项目底层总结二
  11. exe文件关联修复器
  12. 全美“50大好差事” 软件工程师排名第一
  13. BMC通过PECI接口获取CPU温度实现方法
  14. 吴恩达deeplearning之CNN—卷积神经网络入门
  15. 【翻译】--19C Oracle 安装指导
  16. BUG:ImportError: attempted relative import with no known parent package的解决办法
  17. 优雅地封装和使用 ViewBinding,该替代 Kotlin synthetic 和 ButterKnife 了
  18. J-LINK的VCC还是TVCC?
  19. outlook express 邮件附件都带有att000xxx.htm 附件?
  20. 解决百度网盘限速的问题

热门文章

  1. Toolbar的简单使用和封装
  2. R+大地图时代︱ leaflet/leafletCN 动态、交互式绘制地图(遍地代码图)
  3. R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean (三,相似距离)
  4. 区块链学习(3)--以太坊Dapp开发
  5. [译]理解 Node.js 事件驱动架构
  6. DELL Latitude E5400 装了PC DOS 7.1系统启动不了
  7. 提取Unity游戏资源和脚本
  8. Appium+Robotframework实现Android应用的自动化测试-3:一个必不可少的工具介绍
  9. mysql 优化-总结
  10. 移动应用框架 Ionic 4 Ionic for Everyone