二叉树创建以及遍历(递归和非递归方式)

#include <iostream>
#include <assert.h>
#include <stack>

using namespace std;

typedef struct biTreeNode
{
    char data;
    struct biTreeNode *lChild;
    struct biTreeNode *rChild;
}biTreeNode, *biTreePtr;


/********************************创建**********************************/

void create_preOrder_ptr(biTreePtr* tree)
{
    char ch;
//    cin >> ch;//C++风格,过滤掉空白字符(推荐)
    ch = getchar();//C语言风格,不会过滤掉空白字符(不推荐)
    if ('!' == ch)
        return;
    else
    {
        if (ch == '#')
            *tree = NULL;
        else
        {
            *tree = (biTreeNode*)malloc(sizeof(biTreeNode));
            assert(*tree != NULL);
            (*tree)->data = ch;
            create_preOrder_ptr(&((*tree)->lChild));
            create_preOrder_ptr(&((*tree)->rChild));
        }
    }
}

void create_preOrder_ref(biTreePtr &tree)
{
    char ch;
    cin >> ch;
    if ('!' == ch)
        return;
    else
    {
        if (ch == '#')
            tree = NULL;
        else
        {
            tree = (biTreeNode*)malloc(sizeof(biTreeNode));
            assert(tree != NULL);
            tree->data = ch;
            create_preOrder_ref(tree->lChild);
            create_preOrder_ref(tree->rChild);
        }
    }
}

void create_preOrder_val(biTreePtr tree)//值传递的方式无效
{
    char ch;
    cin >> ch;
    if ('!' == ch)
        return;
    else
    {
        if (ch == '#')
            tree = NULL;
        else
        {
            tree = (biTreeNode*)malloc(sizeof(biTreeNode));
            assert(tree != NULL);
            tree->data = ch;
            create_preOrder_val(tree->lChild);
            create_preOrder_val(tree->rChild);
        }
    }
}

/********************************三种递归遍历方式**********************************/

//先序遍历(递归)
void traverse_preOrder_ref(biTreePtr proot)
{
    if (proot)
    {
        cout << proot->data;
        traverse_preOrder_ref(proot->lChild);
        traverse_preOrder_ref(proot->rChild);
    }
}

//中序遍历(递归)
void traverse_inOrder_ref(biTreePtr proot)
{
    if (proot)
    {
        traverse_inOrder_ref(proot->lChild);
        cout << proot->data;
        traverse_inOrder_ref(proot->rChild);
    }
}

//后序遍历(递归)
void traverse_postOrder_ref(biTreePtr proot)
{
    if (proot)
    {
        traverse_postOrder_ref(proot->lChild);
        traverse_postOrder_ref(proot->rChild);
        cout << proot->data;
    }
}

/********************************三种非递归遍历方式**********************************/

//先序遍历(非递归)
void traverse_preOrder2(biTreeNode *proot)
{
    stack<biTreeNode*> stk;
    biTreeNode *p = proot;
    while(p != nullptr || !stk.empty())
    {
        while(p != nullptr)
        {
            cout << p->data << "";
            stk.push(p);
            p = p->lChild;
        }
        if(!stk.empty())
        {
            p = stk.top();
            stk.pop();
            p = p->rChild;
        }
    }
}

//中序遍历(非递归)
void traverse_inorder2(biTreeNode *proot)
{
    stack<biTreeNode*> stk;
    biTreeNode *p = proot;
    while(p != nullptr || !stk.empty())
    {
        while(p != nullptr)
        {
            stk.push(p);
            p = p->lChild;
        }
        if(!stk.empty())
        {
            p = stk.top();
            cout << p->data << "";
            stk.pop();
            p = p->rChild;
        }
    }
}

//后序遍历(非递归)

int main()
{
    //例:输入AB##CD##E##,如果输入不符合二叉树要求,按回车键不会退出创建过程
    biTreePtr pTree = NULL;
    create_preOrder_ptr(&pTree);
    //create_preOrder_ref(tree);
    //create_preOrder_val(tree);//useless

    traverse_preOrder_ref(pTree);  cout << endl;
    traverse_preOrder2(pTree);     cout << endl;
    traverse_inOrder_ref(pTree);   cout << endl;
    traverse_inorder2(pTree);      cout << endl;
    traverse_postOrder_ref(pTree); cout << endl;

      return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值