二叉树的遍历:递归和非递归实现

二叉树的先序遍历:递归和非递归实现 然后,它进入一个循环,从栈中弹出节点并访问它,然后按照先右后左的顺序将右子节点和左子节点压入栈中。先序遍历是二叉树遍历的一种方式,它按照根节点、左子树、右子树的顺序遍历二叉树的所有节点。在这篇文章中,我们将介绍如何使用递归和非递归的方式来实现二叉树的先序遍历,并提供相应的源代码。通过本文,我们详细介绍了如何使用递归和非递归的方式实现二叉树的先序遍历。无论是递归还是非递归的方式,先序遍历都可以帮助我们按照根节点、左子树、右子树的顺序遍历二叉树的所有节点。接下来,我们介绍非递归的方式实现二叉树的先序遍历。 阅读详情
//转自:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
/*二叉树的遍历* 2011.8.25*/ 

#include <iostream>
#include<string.h>
#include<stack> 
using namespace std;

typedef struct node
{
    char data;
    struct node *lchild,*rchild;
}BinTree;

typedef struct node1
{
    BinTree *btnode;
    bool isFirst;
}BTNode;


void creatBinTree(char *s,BinTree *&root)  //创建二叉树,s为形如A(B,C(D,E))形式的字符串 
{
    int i;
    bool isRight=false;
    stack<BinTree*> s1;          //存放结点 
    stack<char> s2;              //存放分隔符
    BinTree *p,*temp;
    root->data=s[0];
    root->lchild=NULL;
    root->rchild=NULL;
    s1.push(root);
    i=1;
    while(i<strlen(s))
    {
        if(s[i]=='(')
        {
            s2.push(s[i]);
            isRight=false;
        }    
        else if(s[i]==',')    
        {
            isRight=true;
        }
        else if(s[i]==')')
        {
            s1.pop();
            s2.pop();
        }
        else if(isalpha(s[i]))
        {
            p=(BinTree *)malloc(sizeof(BinTree));
            p->data=s[i];
            p->lchild=NULL;
            p->rchild=NULL;
            temp=s1.top();
            if(isRight==true)    
            {
                temp->rchild=p;
                cout<<temp->data<<"的右孩子是"<<s[i]<<endl;
            }
            else
            {
                temp->lchild=p;
                cout<<temp->data<<"的左孩子是"<<s[i]<<endl;
            }
            if(s[i+1]=='(')
                s1.push(p);
        }
        i++;
    }    
}

void display(BinTree *root)        //显示树形结构 
{
    if(root!=NULL)
    {
        cout<<root->data;
        if(root->lchild!=NULL)
        {
            cout<<'(';
            display(root->lchild);
        }
        if(root->rchild!=NULL)
        {
            cout<<',';
            display(root->rchild);
            cout<<')';
        }
    }
}

void preOrder1(BinTree *root)     //递归前序遍历 
{
    if(root!=NULL)
    {
        cout<<root->data<<" ";
        preOrder1(root->lchild);
        preOrder1(root->rchild);
    }
}

void inOrder1(BinTree *root)      //递归中序遍历
{
    if(root!=NULL)
    {
        inOrder1(root->lchild);
        cout<<root->data<<" ";
        inOrder1(root->rchild);
    }
} 

void postOrder1(BinTree *root)    //递归后序遍历
{
    if(root!=NULL)
    {
        postOrder1(root->lchild);
        postOrder1(root->rchild);
        cout<<root->data<<" ";
    }    
} 

void preOrder2(BinTree *root)     //非递归前序遍历 
{
    stack<BinTree*> s;
    BinTree *p=root;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)
        {
            cout<<p->data<<" ";
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty())
        {
            p=s.top();
            s.pop();
            p=p->rchild;
        }
    }
}

void inOrder2(BinTree *root)      //非递归中序遍历
{
    stack<BinTree*> s;
    BinTree *p=root;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)
        {
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty())
        {
            p=s.top();
            cout<<p->data<<" ";
            s.pop();
            p=p->rchild;
        }
    }    
} 

void postOrder2(BinTree *root)    //非递归后序遍历
{
    stack<BTNode*> s;
    BinTree *p=root;
    BTNode *temp;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)              //沿左子树一直往下搜索,直至出现没有左子树的结点 
         {
            BTNode *btn=(BTNode *)malloc(sizeof(BTNode));
            btn->btnode=p;
            btn->isFirst=true;
            s.push(btn);
            p=p->lchild;
        }
        if(!s.empty())
        {
            temp=s.top();
            s.pop();
            if(temp->isFirst==true)     //表示是第一次出现在栈顶 
             {
                temp->isFirst=false;
                s.push(temp);
                p=temp->btnode->rchild;    
            }
            else                        //第二次出现在栈顶 
             {
                cout<<temp->btnode->data<<" ";
                p=NULL;
            }
        }
    }    
} 

void postOrder3(BinTree *root)     //非递归后序遍历
{
    stack<BinTree*> s;
    BinTree *cur;                      //当前结点 
    BinTree *pre=NULL;                 //前一次访问的结点 
    s.push(root);
    while(!s.empty())
    {
        cur=s.top();
        if((cur->lchild==NULL&&cur->rchild==NULL)||
           (pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
        {
            cout<<cur->data<<" ";  //如果当前结点没有孩子结点或者孩子节点都已被访问过 
              s.pop();
            pre=cur; 
        }
        else
        {
            if(cur->rchild!=NULL)
                s.push(cur->rchild);
            if(cur->lchild!=NULL)    
                s.push(cur->lchild);
        }
    }    
}


int main(int argc, char *argv[])
{
    char s[100];
    while(scanf("%s",s)==1)
    {
        BinTree *root=(BinTree *)malloc(sizeof(BinTree));
        creatBinTree(s,root);
        display(root);
        cout<<endl;
        preOrder2(root);
        cout<<endl; 
        inOrder2(root);
        cout<<endl;
        postOrder2(root);
        cout<<endl;
        postOrder3(root);
        cout<<endl;
    }
    return 0;
}

二叉树的非递归遍历算法 ⒈ 二叉树的中序、前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现; ⒉ 树与二叉树的转换的实现。 立即下载

相关推荐

CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试

前面CODESY下载安装并熟悉了,p-net搭建从站也已经跑在虚拟机树莓派上了,我们只需要快速搭建一个profinet主站来和从站进行交互即可,这里我们直接用Windows下带的软PLC搭建profinet主站并和p-net的demo从站程序进行IO交互。评估是否进行Windows下的运行时PLC前先看一下注意事项,Windows下安装配置会需要修改boot及防火墙等,可能会影响Windows电脑的正常使用,所以创建项目时的设备可以选择非RTE的。

逍遥游的博客 7313

树:二叉树的非递归遍历算法

二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) { if (NULL != tree) { VisitNode(tree->data); PreOrderTraverse(tree->lchild); PreOrderTraverse(tree->rchild);

重庆李四 1702

JSP期末考试复习习题及答案

以下习题是对于平时课堂小测的整理,如有错误敬请指正! 欢迎一起交流~ 预祝各位小伙伴们考试顺利! Test1 一. 单选题 – 1.(单选题)当用户请求jsp页面时,JSP引擎就会执行该页面的字节码文件响应客户的请求,执行字节码文件的结果是() A. 发送一个JSP源文件到客户端 B. 发送一个Java文件到客户端 C. 发送一个HTML页面到客户端 D. 什么都不做 – 2.(单选题)下列动态网页和静态网页的根本区别描述错误的是( D) A. 静态网页服务器端返回的HTML文件是事先存储好的 B. 动.

技术小白 2万+

二叉排序树非递归遍历 -- C语言

原理 1. 前序遍历 对于 先 序 遍历 非 递归 算法, 这里 我们 使用 一个 栈( stack) 来临 时 存储 节点, 方法 如下。 (1) 打印 根 节点 数据。 (2) 把 根 节点 的 right 入栈, 遍历 左 子 树。 (3) 遍历 完 左 子 树 返回 时, 栈 顶 元素 应为 right, 出 栈, 遍历 以该 指针 为 根 的 子 树。 2. 中序遍历 对...

六六哥的博客 879

Ghost备份还原Win10全攻略:从老电脑迁移到新硬盘,ESP分区处理是关键

本文详细介绍了使用Ghost工具将Win10系统从旧电脑迁移到新硬盘的全过程,特别强调了ESP分区的关键处理方法。通过分步指导备份、分区准备、系统还原和引导修复,帮助用户实现无缝系统迁移,解决常见问题如启动失败和驱动兼容性。

weixin_30823001的博客 672

【思博伦】史上最详细Spirent TestCenter测试仪使用教程精讲(一)!图解超赞超详细!!!

3. 在弹出的界面中,找到菜单栏中的“Connect/Create”,选择下拉框中的“Connect to Physical/Visual Chassis”,在弹出的对话框中输入思博伦测试仪的IP地址:192.168.6.244,点击“OK”;说明:目前我们只需要使用到Raw Stream Block,不需要用到Bound Stream Block。说明:如果要使用100G模式,由于硬件限制,必须连续3个面板端口同时配置为100G使用。打开安装包,并按照提示按照即可。

风云说通信 6479

二叉树遍历实现:递归和非递归

上一个求二叉树公共祖先节点的题用到了后序遍历,临时想起来就总结一下,常见的二叉树遍历方式吧,主要有,先序遍历,中序遍历、后序遍历和层序遍历,每种遍历方式的实现主要有两种:递归和非递归。其中,非递归算法主要用到了栈和队列(层序遍历)代码如下,忘了的时候可以看看。import java.util.LinkedList; public class BinaryTree { //根节点 pr

248

【完整梳理验证】企业微信第三方应用接入全流程java版

由企业内部的开发者自己开发部署,相当于是企业自己的资产,调用接口基本没有任何限制。由SaaS服务商的开发者开发并部署在服务商侧,面向所有企业。需要企业授权使用(先试用后付费),服务商仅可获取企业授权部分的权限,相当于白名单控制。由服务商的开发者开发,但部署在企业内部。一般是线下签约采购方式,因此权限几乎与自建应用无异,企业管理员只需要配置不对服务商开放的敏感权限,相当于黑名单控制。服务商后台地址:企业微信服务商官网企业管理后台地址:企业微信管理后台服务商,可以理解为 SAAS 中的运营端。企业管理端,可以理

Hello, New World! 2760

二叉树问题01:分别用递归和非递归方式实现二叉树先序、中序和后序遍历

【题目】 用递归和非递归的方式,分别按照二叉树先序、中序和后序打印所有的节点。约定:先序遍历顺序为跟、左、右;中序遍历顺序为左、根、右;后序遍历顺序为左、右、根。 【递归代码实现】 class Node{ public: int value; Node *left; Node *right; Node(int d...

路漫漫其修远兮 1681

使用abagen工具箱获取基于脑区的基因表达矩阵

脑区模板定义了您感兴趣的脑区的空间位置。abagen提供了一些预定义的脑区模板,您可以选择使用,也可以使用自定义的脑区模板。它提供了一种简便的方式来获取基于脑区的基因表达矩阵。abagen需要使用Allen脑图谱数据来获取基因表达矩阵。您可以使用abagen内置的下载功能来获取这些数据。这就是使用abagen工具箱获取基于脑区的基因表达矩阵的详细步骤。通过按照上述步骤操作,您可以轻松获取并使用Allen脑图谱数据中的基因表达信息。一旦您加载了脑区模板,您可以使用abagen来获取基于脑区的基因表达矩阵。

web_bug407的博客 1326

[机器学习] 第二章 模型评估与选择 2.ROC:roc_curve原理及源代码详解

代码见:https://github.com/Carrie-Yi/machine_learning/tree/main/roc_curve

心宝的博客 1493

算法习题43:递归和非递归实现二叉树的前序遍历

.递归和非递归俩种方法实现二叉树的前序遍历。 ------------------------------------------------ 递归的替换我们很容易就想到,肯定是借助循环,可是我们这里递归二叉树的时候其实是借助编译器内部的栈来实现存储打印的,从而具有记忆功能, 而现在如果只用循环,这种记忆功能将不存在,所以我们需要利用一个辅助队列来实现 那么这个过程就简单多了,比如下面一棵

ylf13的专栏 948

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C++学习】二叉树的遍历:前中后和层序遍历的递归和非递归的实现

int val;

qq_42647082的博客 780

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

算法学习13:分别用递归和非递归方式实现二叉树先序、中序和后序遍历

数据结构 树结点 class Tree{ public: int data; Tree* left; Tree* right; Tree(int x){this->data=x;left=NULL;right=NULL;} }; 构造一颗二叉树 Tree* head=new Tree(1); head->left=new Tree(2); head->right=new Tree(3); head->left->left=new Tree(4); head-

effort_study的博客 960

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现

二叉树的遍历 1 /* ******************************************************************* 2 created: 2005/12/30 3 created: 30:12:2005 10:39 4 filename: bintree.h 5 author:...

weixin_30258027的博客 72

左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)

本题来自左神《程序员代码面试指南》“分别用递归和非递归方式实现二叉树先序、中序和后序遍历”题目。 题目 用递归和非递归方式,分别按照二叉树先序、中序和后序打印所有的节点。 我们约定: 先序遍历顺序为根、左、右; 中序遍历顺序为左、根、右; 后序遍历顺序为左、右、根。 二叉树节点定义如下: public static class Node { public int value; public Node left; public Node right; public Node(int data.

寒泉 6万+

Java实现二叉树遍历:前序、中序、后序(递归和非递归)

1:前序遍历 (1)访问根结点。 (2)前序遍历左子树。 (3)前序遍历右子树 。 2:中序遍历 (1)中序遍历左子树。 (2)访问根结点。 (3)中序遍历右子树。 3:后序遍历 (1)后序遍历左子树。 (2)后序遍历右子树。 (3)访问根结点。 结点定义: public class Node { private int data; ...

文以的博客 263

1905011打卡:递归和非递归方式实现二叉树的先中后序遍历

题目描述: 用递归和非递归的方式,分别按照二叉树的先序,中序和后序打印所有节点,先序遍历顺序为根,左,右;中序遍历顺序为左,根,右;后序遍历为左,右,根 import java.util.Stack; public class Code_023_PreInPosTraversal { public static class Node { public int data; publi...

谁D了我的BUG 144

数据结构:二叉树的前序遍历、中序遍历、后序遍历的递归和非递归实现(Python)

前序遍历(根、左、右) 递归方式实现 算法: 1.如果结点为空,返回空 2.否则:打印当前结点的值->递归遍历结点的左子树->递归遍历结点的右子树 def PreOrder(node): if node == None: return None else: print(node.value) PreOrd...

ChenS27的博客 362

二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式 二叉树的遍历方式: 1、深度优先:递归,非递归实现方式   1)先序遍历:先访问根节点,再依次访问左子树和右子树   2)中序遍

二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式   二叉树的遍历方式: 1、深度优先:递归,非递归实现方式   1)先序遍历:先访问根节点,再依次访问左子树和右子树   2)中序遍历:先访问左子树,再访问根节点吗,最后访问右子树   3)后序遍历:先访问左子树,再访问右子树,最后访问根节点 2、广度优先     按照树的深度,一层一层的访问树的节点

slinace的博客 548
上一篇: 阿里笔试题(1) 取石子游戏
下一篇: 二叉树C++ Version
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值