二叉树学习笔记(二)

二叉树的深度优先遍历

二叉树的深度优先遍历分为三种,先序遍历,中序遍历和后序遍历
1.先序遍历的操作过程:
若二叉树为空,那么为空操作,否则依次执行如下三个操作

  • 访问根节点(data)
  • 先序遍历左子树
  • 先序遍历右子树

2.中序遍历的操作过程:
若二叉树为空,那么为空操作,否则依次执行如下三个操作

  • 中序遍历左子树
  • 访问根节点(data)
  • 中序遍历右子树

    3.先序遍历的操作过程:
    若二叉树为空,那么为空操作,否则依次执行如下三个操作

  • 后序遍历左子树

  • 后序遍历右子树
  • 访问根节点(data)

二叉树的建立, 三种遍历的递归和非递归方式

#include <iostream>
#include <stack>
using namespace std;

typedef char datatype;
typedef struct Node
{
    datatype data;
    struct Node *lchild;
    struct Node *rchild;
}*BiTree,Node;
void OutputData(datatype ch,int level)
{
    cout << "第" << level << "层元素是" << ch << endl;
}
void OutputData(datatype ch)
{
    cout << "遍历元素为" << ch << endl;
}

/*二叉树的建立*/
void CreateBiTree(BiTree *T)
{

    /*这里的T是(BiTree *)类型的指针,故(*T)是BiTree类型的指针,lchild,rchild都是BiTree类型变量*/
    /*BiTree *T  就相当于Node** T。*/
    datatype ch;
    cin >> ch;
    if (ch == '#')
    {
        *T = NULL;
    }
    else
    {
        *T = (BiTree)malloc(sizeof(Node));
        if (!*T)
            exit(OVERFLOW);
        else
        {
            (*T)->data = ch;
            CreateBiTree(&(*T)->lchild);/*这里先对T解引用,然后指向自己的左结点,探后对自己的左结点取指针,传入CreateBiTree*/
            CreateBiTree(&(*T)->rchild);
        }
    }
}

/*递归方式前序遍历二叉树*/
void PreOrderTraverse(BiTree T, int level)
{
    if (T == NULL)
    {
        return;
    }
    else
    {
        OutputData(T->data,level);
        PreOrderTraverse(T->lchild, level + 1);
        PreOrderTraverse(T->rchild, level + 1);
    }
}

/*递归方式中序遍历二叉树*/
void MidOrderTraverse(BiTree T, int level)
{
    if (T == NULL)
    {
        return;
    }
    else
    {
        MidOrderTraverse(T->lchild, level + 1);
        OutputData(T->data,level);
        MidOrderTraverse(T->rchild, level + 1);
    }
}
/*递归方式后序遍历二叉树*/
void NextOrderTraverse(BiTree T, int level)
{
    if (T == NULL)
    {
        return;
    }
    else
    {
        MidOrderTraverse(T->lchild, level + 1);
        MidOrderTraverse(T->rchild, level + 1);
        OutputData(T->data, level);
    }
}

/*非递归方式前序遍历二叉树*/
void PreOrderTraverse1(BiTree T)
{
    stack<BiTree> s;
    BiTree p = T;
    while (p!=NULL ||!s.empty())//当p指针不为空,或者s不为空时继续循环
    {
        while (p != NULL)//p不为空时继续循环
        {
            OutputData(p->data);
            s.push(p); //p入栈
            p = p->lchild;//P指向他的左子树

        }
        if (!s.empty())
        {
            p = s.top();
            s.pop();
            p = p->rchild;
        }

    }
}
/*非递归方式中序遍历二叉树*/
void MidOrderTraverse1(BiTree T)
{
    stack<BiTree> s;
    BiTree p = T;
    while (p != NULL || !s.empty())
    {
        while (p != NULL)
        {
            s.push(p);
            p = p->lchild;

        }
        if (!s.empty())
        {
            p = s.top();
            OutputData(p->data);
            s.pop();
            p = p->rchild;
        }

    }
}

/*非递归方式后序遍历二叉树*/
void NextOrderTraverse1(BiTree T)
{
    /*与先序遍历和中序遍历不同的是,后序遍历需要添加一个lastvisit的一个指针用来记录已经访问过的最后一个值*/

    stack<BiTree> s;
    BiTree p = T;
    BiTree lastvisit = T;
    while (p != NULL || !s.empty())
    {
        while (p!=NULL)
        {
            s.push(p);
            p = p->lchild;

        }

        p = s.top();
        //如果右子树为空或者右子树被访问过,那么直接输出
        if (p->rchild == NULL || p->rchild == lastvisit)
        {
            OutputData(p->data);
            s.pop();
            lastvisit = p;
            p = NULL;
        }
        else
        {
            p = p->rchild;
        }


    }
}
int main()
{
    int level = 1;
    BiTree bitree=NULL;
    CreateBiTree(&bitree);
    cout << "递归前序遍历输出为:" << endl;
    PreOrderTraverse(bitree, level);
    cout << endl;
    cout << "递归前序遍历输出为:" << endl;
    PreOrderTraverse1(bitree);
    cout << endl;
    cout << "递归中序遍历输出为:" << endl;
    MidOrderTraverse(bitree, level);
    cout << endl;
    cout << "非递归中序遍历输出为:" << endl;
    MidOrderTraverse1(bitree);
    cout << endl;
    cout << "递归后序遍历输出为:" << endl;
    NextOrderTraverse(bitree, level);
    cout << endl;
    cout << "非递归后序遍历输出为:" << endl;
    NextOrderTraverse1(bitree);
    cout << endl;


}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_36130482/article/details/79565982