博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树的遍历(非递归)
阅读量:4515 次
发布时间:2019-06-08

本文共 2024 字,大约阅读时间需要 6 分钟。

#include 
#include
#include
#include
using namespace std; int z[30],h[30]; class Tree {
public:     int data;     Tree *lchild;     Tree *rchild;     Tree()     {
        lchild=NULL;         rchild=NULL;     } }*root; Tree *CreatNode() {
    Tree *root=new Tree();     return root; } Tree *RestoreTree(int z1,int z2,int h1,int h2) {
    Tree *root=CreatNode();     root->data=h[h2];     for(int i=0;z2-i>=z1;i++)     {
        if(z[z2-i]==h[h2])         {
            if(i>0)root->rchild=RestoreTree(z2-i+1,z2,h2-i,h2-1);             if(z2-i>z1)root->lchild=RestoreTree(z1,z2-i-1,h1,h2-i-1);             break;         }     }     return root; } void FDpostOrder(Tree *root)///非递归后序遍历。。更新了一下写法 {
    stack
q;     Tree *temp=root;     Tree *p;     while(temp!=NULL||!q.empty())     {
        while(temp!=NULL)         {
            q.push(temp);             temp=temp->lchild;         }         if(q.top()->rchild!=NULL)///右儿子不为空,则入栈         {
            temp=q.top()->rchild;         }         else         {
            p = q.top();             q.pop();             cout<

data<<' ';             while(!q.empty() && (q.top() -> rchild == NULL || q.top() -> rchild == p))//栈不空是前提,右儿子为空或者右儿子入过栈了且已经出栈了满足输出条件。             {                 p = q.top();                 q.pop();                 cout<

data<<' ';             }         }     } } void FDinOrder(Tree *root) {     stack

q;     Tree *temp=root;     while(temp||!q.empty())///非递归中序遍历,及时栈空了,temp不空,仍然继续     {         while(temp!=NULL)         {             q.push(temp);             temp=temp->lchild;         }         temp=q.top()->rchild;         cout<
data<<' ';         q.pop();     } } void FDpreOrder(Tree *root)///非递归前序遍历 {     stack
q;     Tree *temp=root;     while(temp||!q.empty())     {         while(temp!=NULL)         {             q.push(temp);             cout<
data<<' ';             temp=temp->lchild;         }         temp=q.top()->rchild;         q.pop();     } } int main() {     int n;     cin>>n;     for(int i=0;i
>h[i];     for(int i=0;i
>z[i];     root=RestoreTree(0,n-1,0,n-1);     FDpreOrder(root);     cout<

 

转载于:https://www.cnblogs.com/8023spz/p/7347984.html

你可能感兴趣的文章
php+layui数据表格实现数据分页渲染
查看>>
POJ-1077/HDU-1043
查看>>
pronunciation from Longman 2
查看>>
将数组排序组成最小的整数
查看>>
sqlserver学习--1(登陆,时间函数,查看表结构,查看建表语句,IDENTITY() 函数,查询表名称,查询表结构)...
查看>>
MYSQL 日期函数
查看>>
Oracle触发器之替代触发器
查看>>
NodeJS基础教程之一
查看>>
你真的了解SDWebImage吗?
查看>>
BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)
查看>>
C#嵌套类
查看>>
2017《面向对象程序设计》课程作业三
查看>>
[HDU] 1068 Girls and Boys(二分图最大匹配)
查看>>
ADO.NET类的模型关系图
查看>>
SRM 604 DIV2 250
查看>>
python中异常处理之esle,except,else
查看>>
看苹果官方API
查看>>
06-基础-系统指令-v-model-语法糖原理
查看>>
论文网站相关链接
查看>>
死锁,死锁必要条件及处理策略
查看>>