【数据结构与算法】前中后序——非递归遍历二叉树

参考文献:《数据结构(c++描述)(第二版)》


前言

以非递归的方式——栈,来遍历二叉树。

事实上,这将与之后的线索化二叉树相结合——递归遍历与线索化二叉树难以结合。


〇、 二叉树类/二叉树结点类模板

参见这篇博客

一、先序遍历——NLR()

NLR.h文件

#ifndef __BINARYTREE_NLR_H__
#define __BINARYTREE_NLR_H__

#include 
#include "BinaryTreeNode.h"
using namespace std;

template
void NLR(BinaryTreeNode* t)
{
    //t 指向二叉树根节点
    BinaryTreeNode* stack[100];
    //假定进栈的结点个数不超过100
    unsigned top;
    top=0;stack[0]=t;
    do
    {
        while(stack[top]!=NULL)
        {
            cout<data<<" ";
            stack[++top]=stack[top]->LeftChild;
        }
        if(top>0)stack[top]=stack[--top]->RightChild;
    }while(top>0 || stack[top]); 
}

#endif

二、中序遍历——LNR()

LRN.h文件

#ifndef __BINARYTREE_LNR_H__
#define __BINARYTREE_LNR_H__

#include "BinaryTreeNode.h"
using namespace std;

template
void LNR(BinaryTreeNode* root)
{
    BinaryTreeNode* stack[100];
    unsigned top=0;
    stack[0]=root;
    do
    {
        while(stack[top]!=NULL)
            stack[++top]=stack[top]->LeftChild;
        if(top>0)
        {
            cout<data<<" ";
            stack[top]=stack[top]->RightChild;
        }
    }while(top>0 || stack[top]!=NULL);
}


#endif

三、后序遍历——LRN() 

注意!前序和后序的非递归遍历有着高度的相似性而且易懂。但是后序非递归遍历意味着root最后才能弹栈,而又必须访问完左右子树,所以有很大的不同。

 LRN.h文件

#ifndef __BINARYTREE_LRN_H__
#define __BINARYTREE_LRN_H__

#include "BinaryTreeNode.h"
#include 
using namespace std;

template
void LRN(BinaryTreeNode* root)
{
    BinaryTreeNode* stack[100];
    unsigned top=0,tag[100]={0};
    stack[0]=root;
    do
    {
        while(stack[top]!=NULL)
        {
            stack[++top]=stack[top]->LeftChild;
            tag[top]=0;
        }
        while(tag[top-1]==1)cout<data<<" ";
        if(top>0)
        {
            stack[top]=stack[top-1]->RightChild;
            tag[top-1]=1;
            tag[top]=0;
        }
    }while(top>0);
}


#endif

 


总结

非递归遍历,对于后面如线索化二叉树,有重要的作用

你可能感兴趣的:(数据结构与算法,数据结构,二叉树,非递归遍历)