美文网首页
二叉树先序,中序,后序遍历非递归实现

二叉树先序,中序,后序遍历非递归实现

作者: 三三At你 | 来源:发表于2017-05-11 21:14 被阅读0次
#include<stdio.h>  
#include<string.h>  
#include<stdlib.h>  
#include<queue>  
#include<stack>  
using namespace std;  
char in[30],pre[30],last[30];  
  
typedef struct mynode  
{  
    char data;  
    struct mynode* leftchild;  
    struct mynode* rightchild;  
} Node,*pNode;  
  
void build(char *pre,char *in,int len,pNode &root)  
{  
    if(len<1)  
        return;  
    int i=0;  
    while(pre[0]!=in[i])i++;  
    root = (pNode)malloc(sizeof(Node));  
    root->data = pre[0];  
    root->rightchild = root->leftchild = NULL;  
    build(pre+1,in,i,root->leftchild);  
    build(pre+i+1,in+i+1,len-i-1,root->rightchild);  
}  
  
//层序遍历  
void seqorder(pNode root)  
{  
    pNode temp;  
    queue<pNode> qe1;  
    queue<pNode> qe2;  
    qe1.push(root);
    while(!qe1.empty())  
    {  
        temp = qe1.front();  
        qe1.pop();  
        printf("%c",temp->data);  
        if(temp->leftchild)  
            qe2.push(temp->leftchild);  
        if(temp->rightchild)  
            qe2.push(temp->rightchild);
        if(qe1.empty() && !qe2.empty()){
            swap(qe1,qe2);
            printf("\n");  
        }
    }  
}  
  
//中序遍历  
void inorder(pNode root)  
{  
    if(NULL==root) return;  
    inorder(root->leftchild);  
    printf("%c",root->data);  
    inorder(root->rightchild);  
  
}  
  
//前序遍历  
void preorder(pNode root)  
{  
    if(NULL==root) return;  
    printf("%c",root->data);  
    preorder(root->leftchild);  
    preorder(root->rightchild);  
}  
  
//后续遍历  
void lastorder(pNode root)  
{  
    if(NULL==root)return;  
    lastorder(root->leftchild);  
    lastorder(root->rightchild);  
    printf("%c",root->data);  
}  
  
//前序非递归  
void _preorder(pNode root)  
{  
    stack<pNode> stk;  
    while(!stk.empty()||root!=NULL)  
    {  
        while(root)  
        {  
            stk.push(root);  
            printf("%c",root->data);  
            root = root->leftchild;  
        }  
        root = stk.top();  
        root = root->rightchild;  
        stk.pop();  
    }  
}  
//中序遍历非递归  
void _inorder(pNode root)  
{  
    stack<pNode> stk;  
  
    while(root||!stk.empty())  
    {  
        while(root)  
        {  
            stk.push(root);  
            root = root->leftchild;  
        }  
        root = stk.top();  
        stk.pop();  
        printf("%c",root->data);  
        root = root->rightchild;  
    }  
}  
  
//后续遍历非递归  
void _lastorder(pNode root)  
{  
    stack<pNode> stk1;  
    stack<pNode> stk2;
    stk1.push(root);  
    while(!stk1.empty())  
    {  
        root = stk1.top();  
        stk1.pop();
        stk2.push(root);
        if(root->leftchild){
            stk1.push(root->leftchild);
        }  
        if(root->rightchild){
            stk1.push(root->rightchild);
        }
    }  
    while(!stk2.empty()){
        printf("%d",stk2.top()->data);
        stk2.pop();
    }
}  
int main(void)  
{  
    scanf("%s %s",pre,in);  
    pNode root;  
    build(pre,in,strlen(pre),root);  
    //lastorder(root);  
    _lastorder(root);  
    return 0;  
}  

相关文章

  • 二叉树的操作

    /*主要内容:1、实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式*/ 实现二叉树的先序、中序、后序遍历...

  • 树的遍历,golang实现

    先序,递归 中序,递归 后序,递归 先序,非递归 中序,非递归 后序,非递归 层序遍历

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 二叉树先序、中序、后序遍历 递归与非递归 Python实现 1.先序遍历:根节点->左子树->右子树 2.中序遍历...

  • 二叉树的遍历算法

    递归版本 先序遍历: 中序遍历: 后序遍历: 非递归版本 先序遍历: 中序遍历: 后序遍历: 层次遍历:

  • 数据结构-树的遍历

    1. 先序遍历 递归实现 非递归实现 2. 中序遍历 递归实现 非递归实现 3. 后序遍历 递归实现 非递归实现 ...

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • Java二叉树的遍历

    Java二叉树的遍历 利用递归和非递归实现二叉树的先序,中序,后序遍历以及使用队列实现二叉树的层次遍历

  • 二叉树三种遍历的递归和非递归实现&层次遍历实现(C++)

    对于二叉树的三种遍历方式(先序、中序、后序),用递归和非递归(栈)的方式实现,对于后序遍历用队列实现。 四种遍历方...

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

网友评论

      本文标题:二叉树先序,中序,后序遍历非递归实现

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