数据结构与算法:二叉树的实现和遍历方法(先序,中序,后序,层序遍历)

数据结构与算法:二叉树的实现和遍历方法(递归与非递归)

二叉树是数据结构中非常重要的一种,在它的基本操作方法中,遍历是最基本的也是必须要掌握的。本文将给出二叉树的C++语言实现和遍历的方法。
二叉树的遍历分为递归和非递归,递归方法包括先序遍历,中序遍历,后序遍历。非递归方法包括先序遍历,中序遍历,后序遍历,层序遍历。
下面给出实现代码:

#include <stack>
#include <cstdlib>
#include <stdio.h>
#include <deque>

using namespace std;

typedef struct TreeNode* BinTree;
struct TreeNode //定义
{
    int data; //数据类型以int型为例
    BinTree left;
    BinTree right;
};

BinTree CreatTreeNode(int info)
{
    BinTree thisTreeNode = new TreeNode;
    thisTreeNode->data = info;
    thisTreeNode->left = NULL;
    thisTreeNode->right = NULL;
    return thisTreeNode;
}


//递归实现
void PreOrderTraversal(BinTree BT) //先序遍历
{
    if(BT)
    {
        printf("%d",BT->data);
        PreOrderTraversal(BT->left);
        PreOrderTraversal(BT->right);
    }
}

void InOrderTraversal(BinTree BT) //中序遍历
{
    if(BT)
    {
        InOrderTraversal(BT->left);
        printf("%d",BT->data);
        InOrderTraversal(BT->right);
    }
}

void PostOrderTraversal(BinTree BT) //后序遍历
{
    if(BT)
    {
        PostOrderTraversal(BT->left);
        PostOrderTraversal(BT->right);
        printf("%d",BT->data);
    }
}

//非递归实现
void _PreOrderTraversal(BinTree BT) //先序遍历
{
    stack<BinTree> s;
    BinTree T = BT;
    while(T||!s.empty()){
        while(T){
            printf("%d", T->data);
            s.push(T);
            T = T->left;
        }
        if(!s.empty()){
            T = s.top();
            T = T->right;
            s.pop();
        }
    }
}

void _InOrderTraversal(BinTree BT) //中序遍历
{
    stack<BinTree> s;
    BinTree T = BT;
    while(T||!s.empty()){
        while(T){
            s.push(T);
            T = T->left;
        }
        if(!s.empty()){
            T = s.top();
            printf("%d", T->data); s.pop();
            T = T->right;
        }
    }
}

void _PostOrderTraversal(BinTree BT) //后序遍历
{
    stack<BinTree> s;
    BinTree T = BT, P = NULL;
    while(T||!s.empty()){
        while(T){
            s.push(T);
            T = T->left;
        }
        if(!s.empty()){
            T = s.top(); s.pop();
            if(!T->right || P == T->right) //如果右子树为空,或者右子树已经访问过,则访问此几点
                {printf("%d", T->data); P = T; T = NULL;}
            else //否则重新放回堆栈
                {s.push(T);T = T->right;}
        }
    }
}
void LevelOrderTraversal(BinTree BT) //层序遍历
{
    if(!BT) return; //特殊情况

    deque<BinTree> d;
    BinTree T = BT;
    d.push_back(BT);
    while(!d.empty()){
        T = d.front(); d.pop_front();
        printf("%d", T->data);
        if(T->left) d.push_back(T->left);
        if(T->right) d.push_back(T->right);
    }

}

二叉树的遍历算法需要牢记,在考试和面试中通常会作为基本功来考察。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值