美文网首页
二叉树遍历-非递归方式

二叉树遍历-非递归方式

作者: jas_go | 来源:发表于2019-10-09 11:49 被阅读0次

初始化代码

#include <iostream>
#include <string>
using namespace std;
// 二叉树
typedef struct BiTNode
{
    string data;
    BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

// 初始化二叉树
BiTree tree;
tree = new BiTNode;
tree->data = "1";

BiTNode *p;

p = new BiTNode;
p->data="2";
p->lchild=NULL;
p->rchild=NULL;
tree->lchild=p;

p = new BiTNode;
p->data="3";
p->lchild=NULL;
p->rchild=NULL;
tree->rchild=p;


p = new BiTNode;
p->data="4";
p->lchild=NULL;
p->rchild=NULL;
tree->lchild->rchild=p;

p = new BiTNode;
p->data="6";
p->lchild=NULL;
p->rchild=NULL;
tree->lchild->rchild->lchild=p;

p = new BiTNode;
p->data="5";
p->lchild=NULL;
p->rchild=NULL;
tree->rchild->rchild=p;

用链式线性表做栈

typedef struct StackNode{
    BiTree data;
    StackNode *next;
}*Stack;

void InitStack(Stack &S)
{
    S = new StackNode;
    S->next=NULL;
}
void InitStack(Stack &S)
{
    S = new StackNode;
    S->next=NULL;
}
BiTree PopStack(Stack &S)
{
    BiTree x=S->next->data;
    StackNode *q = S->next;
    S->next=S->next->next;
    free(q);
    return x;
}
BiTree TopStack(Stack &S)
{
    return S->next->data;
}
  1. 先序遍历
/*
先序遍历非递归方案;
顺序:中、左、右
先访问中
有右子树先push到stack
再访问左子树
没有再pop出stack
*/

void PreOrder(BiTree &T)
{
    Stack s;
    InitStack(s);
    BiTree p=T;
    while(p||!StackIsEmpty(s))
    {
        if(p)
        {
            cout<<p->data;
            if(p->rchild)
                PushStack(s,p->rchild);
            p=p->lchild;
        }
        else
        {
            p=PopStack(s);
        }
    }
    
}
  1. 中序遍历
/*
中序遍历非递归方案;
顺序:左,中,右
优先访问左,有左子树则push到stack
没有左子树则进行访问节点内容,然后访问右子树--》重复开始内容
*/

void InOrder(BiTree &T)
{
    Stack s;
    InitStack(s);
    BiTree p=T;
    while(p||!StackIsEmpty(s))
    {
        if(p)
        {
            PushStack(s, p);
            p=p->lchild;
        }
        else
        {
            p=PopStack(s);
            cout<<p->data;
            p=p->rchild;
        }
    }
    
}
  1. 后序遍历
/*
后序遍历非递归方案;
顺序:左,右,中
- 遍历规则:将不为空的右子树、左子树压入栈
- 访问数据的条件:左右子树为空或者左右子树都被访问过;
*/
void PostOrder(BiTree &T)
{
    Stack s;
    InitStack(s);
    BiTree p=T;
    BiTree pre=p;
    PushStack(s, p);
    while(!StackIsEmpty(s))//p最后指向跟节点,不可能为空
    {     
        p=TopStack(s); 
        if((p->lchild==NULL&&p->rchild==NULL)||(pre!=NULL&&(pre==p->lchild||pre==p->rchild)))
        // 输出节点条件:子树都为空,或者子树都被访问过
        {
            cout<<p->data;
            pre=p;
            PopStack(s);
        }
        else
        {
        if(p->rchild)
            PushStack(s,p->rchild);
        if(p->lchild)
            PushStack(s,p->lchild);
        }
    }
}

输出结果

PreOrder(tree)
InOrder(tree)
PostOrder(tree)
/*
124635
264135
642531
*/

相关文章

  • 二叉树遍历

    请递归,非递归方式分别前序遍历,中序遍历,后续遍历二叉树

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • 二叉树遍历java,非递归、层次。

    /** * 前序遍历 * 递归 */ /*** 前序遍历* 非递归*/ 后续遍历非递归 二叉树层次遍历基于java...

  • 不一样的二叉树非递归遍历

    本篇将讨论模拟系统栈的二叉树非递归遍历,并由此讨论一般化的将递归程序改为非递归程序的方式。 二叉树的非递归遍历 就...

  • 二叉树递归非递归遍历算法整理

    一、二叉树前序遍历 1 前序递归遍历 2.前序非递归遍历 一、二叉树中序遍历 2.中序递归遍历 1.中序非递归遍历...

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 二叉树的三种深度优先遍历算法与思路

    看了一些关于二叉树遍历算法的文章,例如:二叉树三种遍历方式的递归和循环实现二叉树的递归与非递归遍历(前序、中序、后...

  • 二叉树遍历

    二叉树的遍历 1. 前序遍历 1.1 递归前序遍历 1.2 非递归前序遍历 2 中序遍历 2.1递归遍历 2.2非...

  • 二叉树的各类遍历方法

    二叉树的遍历主要有四种:前序、中序、后序、层序。 遍历的实现方式主要是:递归和非递归。递归遍历的实现非常容易,非递...

  • 大数据面试题目

    一、数据结构与算法 1.二叉树前序、中序、后续遍历方式(递归以及非递归) 2.二叉树的深度以及广度遍历方式 ...

网友评论

      本文标题:二叉树遍历-非递归方式

      本文链接:https://www.haomeiwen.com/subject/cxkwuctx.html