二叉树的非递归操作

这里涉及到二叉树的非递归操作有:先序遍历、中序遍历、后序遍历

====数据结构====

树结点:
struct Node
{
    
char data;
    Node 
* left;
    Node 
* right;
};

标志:
enum Tag{goLeft, goRight, goBack };
goLeft指示访问左子树
goLeft指示访问右子树(左子树已访问)
goBack指示回溯(左右子树均已访问)

两个栈:
vector<Node *> vec_node;
vector
<Tag> vec_flag;
两个栈同时消长、空

所有操作相同的部分:
Node *curNode = vec_node.back();//栈顶
Tag curFlag = vec_flag.back();  //栈顶

switch(curFlag)
        {
            
case goLeft:
                
//更改标志
                vec_flag.pop_back();
                vec_flag.push_back(goRight);

                
//左子树入栈
                if(curNode->left != NULL)
                {
                    vec_node.push_back(curNode
->left);
                    vec_flag.push_back(goLeft);
                }
                
break;

            
case goRight:
                
//更改标志
                vec_flag.pop_back();
                vec_flag.push_back(goBack);

                
//右子树入栈
                if(curNode->right != NULL)
                {
                    vec_node.push_back(curNode
->right);
                    vec_flag.push_back(goLeft);
                }
                
break;

            
case goBack:
                
//结点出栈
                vec_flag.pop_back();
                vec_node.pop_back();
                
break;

            
default:
                
break;
        }
//switch-end

几种操作唯一不同的是:需要的操作放置的位置不同。
先序遍历:打印结点放在goLeft中
中序遍历:打印结点放在goRight中
后续遍历:打印结点放在goBack中
打印所有路径:在goBack中判断是否为叶子结点,如果是,打印栈中所有路径;如果否,直接出栈

详细代码见下面:(注意其中红色的地方是唯一差别的地方:
#include <iostream>
#include 
<vector>
#include 
<cstdlib>
using namespace std;


struct Node
{
    
char data;
    Node 
* left;
    Node 
* right;
};

enum Tag{goLeft, goRight, goBack };

void PreOrder(Node *root)
{
    assert(root 
!= NULL);

    vector
<Node *> vec_node;
    vector
<Tag> vec_flag;
    
//init
    vec_node.push_back(root);
    vec_flag.push_back(goLeft);

    
while(!vec_node.empty())
    {
        Node 
*curNode = vec_node.back();
        Tag curFlag 
= vec_flag.back();

        
switch(curFlag)
        {
            
case goLeft:
                cout << curNode->data << "  ";
                vec_flag.pop_back();
                vec_flag.push_back(goRight);

                
if(curNode->left != NULL)
                {
                    vec_node.push_back(curNode
->left);
                    vec_flag.push_back(goLeft);
                }
                
break;

            
case goRight:
                vec_flag.pop_back();
                vec_flag.push_back(goBack);

                
if(curNode->right != NULL)
                {
                    vec_node.push_back(curNode
->right);
                    vec_flag.push_back(goLeft);
                }

                
break;


            
case goBack:
                vec_flag.pop_back();
                vec_node.pop_back();
                
break;

            
default:
                
break;
        }
//switch-end
    }//while-end

}

void InOrder(Node *root)
{
    assert(root 
!= NULL);

    vector
<Node *> vec_node;
    vector
<Tag> vec_flag;
    
//init
    vec_node.push_back(root);
    vec_flag.push_back(goLeft);

    
while(!vec_node.empty())
    {
        Node 
*curNode = vec_node.back();
        Tag curFlag 
= vec_flag.back();

        
switch(curFlag)
        {
            
case goLeft:
                vec_flag.pop_back();
                vec_flag.push_back(goRight);

                
if(curNode->left != NULL)
                {
                    vec_node.push_back(curNode
->left);
                    vec_flag.push_back(goLeft);
                }
                
break;

            
case goRight:
                cout << curNode->data << "  ";
                vec_flag.pop_back();
                vec_flag.push_back(goBack);

                
if(curNode->right != NULL)
                {
                    vec_node.push_back(curNode
->right);
                    vec_flag.push_back(goLeft);
                }

                
break;


            
case goBack:


                vec_flag.pop_back();
                vec_node.pop_back();
                
break;

            
default:
                
break;
        }
//switch-end
    }//while-end

}

void PostOrder(Node *root)
{
    assert(root 
!= NULL);

    vector
<Node *> vec_node;
    vector
<Tag> vec_flag;
    
//init
    vec_node.push_back(root);
    vec_flag.push_back(goLeft);

    
while(!vec_node.empty())
    {
        Node 
*curNode = vec_node.back();
        Tag curFlag 
= vec_flag.back();

        
switch(curFlag)
        {
            
case goLeft:
                vec_flag.pop_back();
                vec_flag.push_back(goRight);

                
if(curNode->left != NULL)
                {
                    vec_node.push_back(curNode
->left);
                    vec_flag.push_back(goLeft);
                }
                
break;

            
case goRight:
                vec_flag.pop_back();
                vec_flag.push_back(goBack);

                
if(curNode->right != NULL)
                {
                    vec_node.push_back(curNode
->right);
                    vec_flag.push_back(goLeft);
                }

                
break;


            
case goBack:
                cout << curNode->data << "  ";


                vec_flag.pop_back();
                vec_node.pop_back();
                
break;

            
default:
                
break;
        }
//switch-end
    }//while-end

}


/* 打印从根到叶子结点之路径 */
void PrintPath( const vector<Node *> & v )
{
    vector
< Node *>::const_iterator vi;
    
for( vi = v.begin(); vi!=v.end(); ++vi )
    {
        Node 
* n = reinterpret_cast< Node *>(*vi);
        cout
<< n->data<< " ";
    }
    cout
<< endl;
}

void PrintAllPaths(Node *root)
{
    assert(root 
!= NULL);

    vector
<Node *> vec_node;
    vector
<Tag> vec_flag;
    
//init
    vec_node.push_back(root);
    vec_flag.push_back(goLeft);

    
while!vec_node.empty())
    {
        Node 
*curNode = vec_node.back();
        Tag curFlag 
= vec_flag.back();


        
switch(curFlag)
        {
            
case goLeft:
                vec_flag.pop_back();
                vec_flag.push_back(goRight);

                
if(curNode->left != NULL)
                {
                    vec_node.push_back(curNode
->left);
                    vec_flag.push_back(goLeft);
                }
                
break;

            
case goRight:
                vec_flag.pop_back();
                vec_flag.push_back(goBack);

                
if(curNode->right != NULL)
                {
                    vec_node.push_back(curNode
->right);
                    vec_flag.push_back(goLeft);
                }

                
break;


            
case goBack:
                
if(NULL == curNode->left && NULL == curNode->right)
                    PrintPath(vec_node);

                vec_flag.pop_back();
                vec_node.pop_back();
                
break;

            
default:
                
break;
        }
//switch-end
    }//while-end
}

int main()
{
    Node root, b, c, d, e, f, g, h;
    root.data
='a';
    root.left
=&b;
    root.right
=&e;

    b.data
='b';
    b.left
=&c;
    b.right
=&d;

    c.data
='c';
    c.left
=NULL;
    c.right
=NULL;

    d.data
='d';
    d.left
=NULL;
    d.right
=NULL;

    e.data
='e';
    e.left
=&f;
    e.right
=&g;

    f.data
='f';
    f.left
=NULL;
    f.right
=NULL;

    g.data
='g';
    g.left
=NULL;
    g.right
=&h;

    h.data
='h';
    h.left
=NULL;
    h.right
=NULL;


    cout 
<< "Print all paths:\n";
    PrintAllPaths(
&root);
    cout 
<< "\n";

    cout 
<< "PostOrder:\n";
    PostOrder(
&root);
    cout 
<< "\n";

    cout 
<< "PreOrder:\n";
    PreOrder(
&root);
    cout 
<< "\n";

    cout 
<< "InOrder:\n";
    InOrder(
&root);
    cout 
<< "\n\n";

    system(
"PAUSE");
    
return 0;
}

运行结果:

转载于:https://www.cnblogs.com/chio/archive/2007/10/24/935784.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建立公司

最近标哥说有创业的想法&#xff0c;然后我帮忙搜了下关于创办公司的一些文章&#xff0c;晓宇的这篇文章把创业的过程写了个大概&#xff0c;也分享给大家&#xff0c;如果有创业想法的&#xff0c;按照这样的思路去寻找自己的合伙人。 自从17年4月份开始辞职创业&#xff0c;…

第五节 CImage和CBmp(二)

由于这个库主要用于VC MFC下开发应用&#xff0c;因此目前可以下载到版本只支持MFC开发。如果您需要标准Win32的库&#xff0c;可以在回复时留下您的邮箱&#xff0c;或跟我联系。Email&#xff1a;wuchunlei163.comQQ&#xff1a;819543772EasyAnalysis图像分析库测试版以及源…

Linux 新系统易用性向 Windows 看齐

大家好&#xff0c;今天是一年一度的高考&#xff0c;不知道各位在多年以前有没有后悔选择电子专业&#xff0c;如果再给你一次机会&#xff0c;你会选择其他专业吗&#xff1f;以下是内容正文&#xff0c;由黄工整理&#xff01;来源 | 网络嵌入式开发&#xff0c;很多工程师都…

深度剖析SOC高性能实时事件关联分析引擎

【引言】安全管理平台&#xff08;SOC&#xff09; 的一项关键技术就是事件关联分析。借助实时的事件关联分析引擎&#xff0c;安全管理平台能够发掘出复杂的海量安全日志和事件背后隐藏的信息&#xff0c;引导安全管理人员发现外 部***和内部违规行为。作为本系列的第五篇文章…

靠,嘉立创打板又降价

说个题外话&#xff0c;我前段时间和同事聊天&#xff0c;我同事是一个项目经理&#xff0c;我跟他说我有朋友在嘉立创&#xff0c;然后随口说了句&#xff0c;我们这个行业应该没有不知道嘉立创的吧&#xff0c;我同事回了一句&#xff0c;什么是嘉立创&#xff0c;然后我愣了…

拆解一个比亚迪的车钥匙,这个黑黑的元器件是什么?

今天抽屉突然找到一个比亚迪的车钥匙&#xff0c;寻思着没事拆开看看用什么方案做的。正面照&#xff0c;哪款车型的&#xff0c;不知道了背面照&#xff0c;很简洁&#xff0c;只有一个BYD的Logo接下来就是撬开了&#xff0c;过程非常顺利&#xff0c;之前撬开一个宝马车的钥匙…

分布式事物(同样适用于dubbo事务等分布式事务)

转载于:https://www.cnblogs.com/tian1993/p/10081901.html

一些web开发中常用的、做成cs文件的js代码 - 搜刮来的

using System;using System.Web;using System.Web.UI;namespace COCOWO.COMP{ /// <summary> /// 一些常用的Js调用 /// 创建时间&#xff1a;2006-8-3 /// 创建者&#xff1a;马先光 /// </summary> public class Jscript { …

库里扛起了勇士对凯尔特人的第四场

最近临近毕业季&#xff0c;有朋友这样说「我一定是要支持勇士的&#xff0c;毕竟库里和詹姆斯陪了整个大学四年啊」。昨晚上加班到11点半&#xff0c;到家洗完澡已经是凌晨1点了&#xff0c;那时候是想得很清楚的&#xff0c;明天是不想被其他事情打扰我看球赛的。这场比赛&am…

Nginx应用案例分享:压力测试

2019独角兽企业重金招聘Python工程师标准>>> 在运维工作中&#xff0c;压力测试是一项非常重要的工作。比如在一个网站上线之前&#xff0c;能承受多大访问量、在大访问量情况下性能怎样&#xff0c;这些数据指标好坏将会直接影响用户体验。 但是&#xff0c;在压力…

声音是什么?

转自博客园《【秒懂音视频开发】02_重识声音》&#xff0c;https://www.cnblogs.com/mjios/p/14466418.html#5035688#!comments声音的产生声音&#xff08;Sound&#xff09;&#xff0c;是由物体的振动产生的。一切正在发声的物体都在振动。我们说话的时候&#xff0c;是声带在…

[源码和文档分享]基于C语言的语法高亮设计与实现

一 需求分析 在所需高亮的关键字或字符串前后加上class标签&#xff0c;在css定义颜色。 二 程序设计 2.1 设计思路 把.html文件和.css文件中的内容存在两个字符数组中&#xff0c;在.cpp用文件操作写入。 2.2 文件组织架构 Syntax highlighting.exe所在目录为根目录 源代码命…

我愿为这二极管奉献我的一生

简 介&#xff1a; 利用二极管完成对信号的整流&#xff0c;求取绝对值等具有很多的应用。然而在小信号下&#xff0c;二极管的前向导通电压以及相应的杂散电容会对信号整流带来严重的影响。本文从“马场清太郎”所著的“运算放大器应用电路设计”中摘取了一些典型应用电路&…

【毕业设计】履带四足复合机器人

1.项目简介本项目中&#xff0c;履足式复合机器人拥有两种行进模式&#xff1a;四足行进模式、履带行进模式&#xff0c;应对不同场景及地形时能够切换形态。四足形态下整体总共拥有8个自由度DOF&#xff0c;单腿各具备2个自由度DOF&#xff0c;足端结构融入了履带机构&#xf…

c#: 任务栏进度显示(TaskbarManager)

Win7及以上系统支持任务栏进度条&#xff0c;为有进度类应用显示进度于任务栏&#xff0c;甚为方便。 以c#之WinForm实现其&#xff0c;大多采用Windows API Code Pack这个方案&#xff0c;加多引用&#xff0c;比较繁琐&#xff0c;而我总也打不开了其页面。 鄙人不喜欢多引用…

今天,过了27年后,IE浏览器停用了

前言随着Windows的官宣&#xff0c;ie浏览器将于6月16日正式退役。https://www.microsoft.com/zh-cn/download/internet-explorer.aspx那个曾几何时的浏览器之王&#xff0c;经历一次又一次操作系统的迭代&#xff0c;直至新兴浏览器的出现后沦为浏览器鄙视链的最后一层&#x…

boost库学习入门篇

学习及使用Boost库已经有一段时间了&#xff0c;Boost为我的日常开发中带来了极大的方便&#xff0c;也使得我越来越依赖于boost库了。但boost功能太多&#xff0c;每次使用还是得翻看以前的 资料&#xff0c;所以为了以后可以更方便的使用&#xff0c;在此对常用的功能作一个…

开源 STM32 USB-CAN项目

照理来说&#xff0c;USB-CAN这种东西应该已经被做的烂大街的工具&#xff0c;国内居然没有一个拿得出手的开源方案。某立功和PCAN动辄2000的价格也是离谱。淘宝上各种虚拟串口方案、替换dll兼容某立功软件的各种方案....价格都倒是便宜&#xff0c;性能和可靠性嘛.......就不多…

Go语言web框架 gin

Go语言web框架 GIN gin是go语言环境下的一个web框架, 它类似于Martini, 官方声称它比Martini有更好的性能, 比Martini快40倍, Ohhhh….看着不错的样子, 所以就想记录一下gin的学习. gin的github代码在这里: gin源码. gin的效率获得如此突飞猛进, 得益于另一个开源项目httproute…

8位ADC是256还是255?

昨天的文章发了之后&#xff0c;有朋友找到我&#xff0c;给我讨论了很多关于ADC细节。晚上给个朋友在51上调ADC0808芯片有一个朋友是做硬件的&#xff0c;他有从事过专业仪器设备&#xff0c;常年有使用ADC的经验&#xff0c;他给我的观点是&#xff0c;8位ADC对应的就是256。…