创建二叉树遍历二叉树

一、创建一个固定的树

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    int nValue;
    struct node *pLeft;
    struct node *pRight;
}BinaryTree;

BinaryTree *CreateBinaryTree()
{
    BinaryTree *pRoot = NULL;

    //根
    pRoot = (BinaryTree*)malloc(sizeof(BinaryTree));
    pRoot->nValue = 1;
    

    //根的左
    pRoot->pLeft = (BinaryTree*)malloc(sizeof(BinaryTree));
    pRoot->pLeft->nValue = 2;

    //左的左
    pRoot->pLeft->pLeft = (BinaryTree*)malloc(sizeof(BinaryTree));
    pRoot->pLeft->pLeft->nValue = 4;
    pRoot->pLeft->pLeft->pLeft = NULL;
    pRoot->pLeft->pLeft->pRight = NULL;

    //左的右
    pRoot->pLeft->pRight = (BinaryTree*)malloc(sizeof(BinaryTree));
    pRoot->pLeft->pRight->nValue = 5;
    pRoot->pLeft->pRight->pLeft = NULL;
    pRoot->pLeft->pRight->pRight = NULL;

    //根的右
    pRoot->pRight = (BinaryTree*)malloc(sizeof(BinaryTree));
    pRoot->pRight->nValue = 3;

    //右的左
    pRoot->pRight->pLeft = (BinaryTree*)malloc(sizeof(BinaryTree));
    pRoot->pRight->pLeft->nValue = 6;
    pRoot->pRight->pLeft->pLeft = NULL;
    pRoot->pRight->pLeft->pRight = NULL;

    pRoot->pRight->pRight = NULL;

    return pRoot;
}

在创建函数中将左右孩子都malloc出来无孩子的结点其指向左孩子和指向右孩子的指针必须赋值为空

先讲创建方法2之前我先介绍一下树的遍历

树的遍历:

先序遍历

先序遍历(前序遍历)    根   左   右     上图树的先序遍历为 1,2,4,5,3,6

说明:从根结点开始(根,左,右) 输出根 找到根的左孩子 这时可以将其左孩子当成根结点并且重复以上操作

中序遍历    左  右  根  上图树的中序遍历为 4,2,5,1,6,3

说明:从根节点开始(左右根)找到根的左孩子 将其左孩子当成根然后重复以上操作

后序遍历:左    右     根       上图的树的后序遍历为 4,5,2,6,3,1

说明:从根节点开始(左右根)找到跟的左 重复以上操作

创建方法2:

利用先序遍历的方法(递归)创建二叉树

void CreateBiTree(BinaryTree **pTree)
{
    int nNum;
    scanf("%d",&nNum);

    if(nNum == 0)return;

    *pTree = (BinaryTree*)malloc(sizeof(BinaryTree));
    (*pTree)->nValue = nNum;
    (*pTree)->pLeft = NULL;
    (*pTree)->pRight = NULL;

    CreateBiTree(&((*pTree)->pLeft));
    CreateBiTree(&((*pTree)->pRight));
}

规则:如果当前结点没有左孩子则输入零 没有右孩子也要输入零

二叉树的遍历

递归方法实现二叉树的遍历:

先序:

void PreOrderTraversal(BinaryTree *pTree)
{
    if(pTree == NULL)return;
    
    //根
    printf("%d ",pTree->nValue);
    
    //左
    PreOrderTraversal(pTree->pLeft);
    //右
    PreOrderTraversal(pTree->pRight);
}

中序:

void InOrderTraversal(BinaryTree *pTree)
{
    if(pTree == NULL)return;
    
    //左
    InOrderTraversal(pTree->pLeft);
    //根
    printf("%d ",pTree->nValue);
    //右
    InOrderTraversal(pTree->pRight);
}

后序:

void LastOrderTraversal(BinaryTree *pTree)
{
    if(pTree == NULL)return;
    
    //左
    LastOrderTraversal(pTree->pLeft);
    //右
    LastOrderTraversal(pTree->pRight);
    //根
    printf("%d ",pTree->nValue);
}
 

猜你喜欢

转载自blog.csdn.net/qq_37163944/article/details/84196740