二叉树遍历C++11实现———前序、中序、后序、层序遍历(非递归)

来源:互联网 发布:淘宝怎么提高排名信誉 编辑:程序博客网 时间:2024/04/28 13:40

Makefile:

g++ -std=c++11 -o biTreeTrasverse biTreeTrasverse.cpp

代码:

biTreeTrasverse.cpp

#include <stack>#include <queue>#include <iostream>struct node {    char val;    node* left;    node* right;};

前序遍历

void preOrder(node *root){    std::stack<node*> stack;    node *p = root;    while ((nullptr != p) || (!stack.empty()))    {        while (nullptr != p)        {            std::cout << p->val;            stack.push(p);            p = p->left;        }        if (!stack.empty())        {            p = stack.top();            stack.pop();            p = p->right;        }    }}

中序遍历

void inOrder(node *root){    std::stack<node*> stack;    node *p = root;    while ((nullptr != p) || (!stack.empty()))    {        while (nullptr != p)        {            stack.push(p);            p = p->left;        }        if (!stack.empty())        {            p = stack.top();            stack.pop();            std::cout << p->val;            p = p->right;        }    }}

后续遍历

void postOrder(node *root){    std::stack<node*> stack;    std::stack<node*> store;    node *p = root;    while ((nullptr != p) || (!stack.empty()))    {        while (nullptr != p)        {            store.push(p);            stack.push(p);            p = p->right;        }        if (!stack.empty())        {            p = stack.top();            stack.pop();            p = p->left;        }    }    while (!store.empty())    {        p = store.top();        store.pop();        std::cout << p->val;    }}

层序遍历

void levelOrder(node* root){    std::queue<node*> queue;    if (nullptr != root)    {        queue.push(root);       }    while (!queue.empty())    {        node* p = queue.front();        queue.pop();        std::cout << p->val;        if (nullptr != p->left)        {            queue.push(p->left);        }        if (nullptr != p->right)        {            queue.push(p->right);        }    }}

main函数

int main(){    node K{'K', nullptr, nullptr};    node J{'J', nullptr, nullptr};    node I{'I', nullptr, nullptr};    node H{'H', nullptr, &K};    node G{'G', nullptr, &J};    node F{'F', &I, nullptr};    node E{'E', nullptr, nullptr};    node D{'D', &H, nullptr};    node C{'C', &F, &G};    node B{'B', &D, &E};    node A{'A', &B, &C};    node *root = &A;    std::cout << "preOrder:  ";    preOrder(root);    std::cout << std::endl;    std::cout << "inOrder:   ";    inOrder(root);    std::cout << std::endl;    std::cout << "postOrder: ";    postOrder(root);    std::cout << std::endl;    std::cout << "levelOrder:";    levelOrder(root);    std::cout << std::endl;}

二叉树

这里写图片描述

结果

preOrder:   ABDHKECFIGJinOrder:    HKDBEAIFCGJpostOrder:  KHDEBIFJGCAlevelOrder: ABCDEFGHIJK
阅读全文
0 0
原创粉丝点击