二叉树遍历

#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("\n建立的二叉树的右子树为:");
    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:\n");
    scanf("%d", &count);
    printf("input data(num = %d):\n", count);
    btree = CreateTree(count);

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值