5.5二叉树的遍历

#include <stdio.h>
#include <stdlib.h>
#define MAX 50

//二叉树链表存储结构
typedef struct btnode
{
    int data;        //结点数据内容
    struct btnode *Llink;   //左子树指针
    struct btnode *Rlink;   //右子树指针
}btnode, *btreetype;

/****---------------------------------------------****/
//函数名:  OutputTree(btreetype &root)
//參数:    (传入)btreetype &root 二叉树指针
//功能:    输出二叉树
/****---------------------------------------------****/
void OutputTree(btreetype &root)
{
    btreetype p;
    //打印左子树
    p = root->Llink;
    printf("建立的二叉树的左子树:");
    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->Llink;
    }
    //打印右子树
    p = root->Rlink;
    printf("
建立的二叉树的右子树为:");
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->Rlink;
    }
}

/****--------------------------------------------****/
//函数名: PreOrder(btreetype &root)
//參数:   (传入)btreetype &root二叉树指针
//功能:   先序遍历二叉树
/****--------------------------------------------****/
void PreOrder(btreetype &root)
{
    btreetype p;
    p = root;
    if(p != NULL)
    {
        printf("%d ",p->data);
        PreOrder(p->Llink);    //递归处理左子树
        PreOrder(p->Rlink);    //递归处理右子树
    }
}

/****--------------------------------------------****/
//函数名: InOrder(btreetype &root)
//參数:   (传入)btreetype &root二叉树指针
//功能:   中序遍历二叉树(递归方式)
/****--------------------------------------------****/
void InOrder(btreetype &root)
{
    btreetype p;
    p = root;
    if(p != NULL)
    {
        InOrder(p->Llink);   //递归处理左子树
        printf("%d ", p->data);
        InOrder(p->Rlink);   //递归处理右子树
    }
}

/****-------------------------------------------****/
//函数名: InOrder(btreetype &root)
//參数:   (传入)btreetype &root二叉树指针
//功能:   中序遍历二叉树(非递归方式)
/****--------------------------------------------****/
void InOrder_Norecursion(btreetype &root)
{
    btreetype stack[MAX];
    btreetype p;
    int top = 0;
    p = root;
    do
    {
        while(p != NULL)  //扫描左结点
        {
            top++;
            stack[top] = p;
            p = p->Llink;
        }
        if(top > 0)
        {
            p = stack[top];   //p所指结点为无左子树或其左子树已遍历过
            top--;
            printf("%d ", p->data);
            p = p->Rlink;  //扫描右结点
        }
    }while(p != NULL || top != 0);
}

/****--------------------------------------------****/
//函数名:  PostOrder(btreetype &root)
//參数:    (传入)btreetype &root 二叉树指针
//功能:    后序遍历二叉树
/****--------------------------------------------****/
void PostOrder(btreetype &root)
{
    btreetype p;
    p = root;
    if(p != NULL)
    {
        PreOrder(p->Llink);   //递归处理左子树
        PreOrder(p->Rlink);   //递归处理右子树
        printf("%d ", p->data);
    }
}

/****--------------------------------------------****/
//函数名: CreateTree(int n)
//參数:   (传入)int n数据数量
//返回值: 返回二叉树(根结点)指针
//功能:   建立二叉树
/****--------------------------------------------****/
btreetype CreateTree(int n)
{
    int i;
    btreetype root = NULL;
    for(i = 0; i < n; i++)
    {
        btreetype newNode;
        btreetype currentNode;
        btreetype parentNode;

        //建立新结点
        newNode = (btreetype)malloc(sizeof(btnode));
        scanf("%d", &newNode->data); /*新结点赋值*/
        newNode->Llink = NULL;
        newNode->Rlink = NULL;

        currentNode = root;  //存储当前结点指针
        if(currentNode == NULL) root = newNode;  //以新结点作为二叉树根结点
        else
        {
            while(currentNode != NULL)
            {
                parentNode = currentNode; //存储当前结点的父结点
                if(newNode->data < currentNode->data) //比較结点数值大小
                    currentNode = currentNode->Llink;  //左子树
                else
                    currentNode = currentNode->Rlink;  //右子树
            }
            //依据数值大小连接父结点和子结点
            if(newNode->data < parentNode->data)
                parentNode->Llink = newNode;
            else
                parentNode->Rlink = newNode;
        }//else
    }//for
    return root;
}
/****------------測试主程序------------------****/
int main()
{
    btreetype btree;
    int count;
    printf("input the number of elements:
");
    scanf("%d", &count);
    printf("input data(num = %d):
", count);
    btree = CreateTree(count);

    //二叉树的各种遍历
    printf("
先序遍历建立的二叉树:");
    PreOrder(btree);
    printf("
中序遍历建立的二叉树(递归方式):");
    InOrder(btree);
    printf("
中序遍历建立的二叉树(非递归方式):");
    InOrder_Norecursion(btree);
    printf("
后序遍历建立的二叉树:");
    PostOrder(btree);
    return 0;
}

原文地址:https://www.cnblogs.com/yjbjingcha/p/6977962.html