辛星算法教程第一节即二叉树的递归遍历

    我们都知道,二叉树的递归遍历可以分为三种:前序遍历、中序遍历和后序遍历,其实这三种遍历方式大同小异,由于都是使用递归实现的,因此也比较简单。

    首先是tree.h文件,代码如下: 

    

#ifndef TREE_H
#define TREE_H


#include <stdio.h>
#include <malloc.h>
#include <assert.h>


typedef int ElemType;

typedef struct Btree
{
    ElemType val;
    struct Btree* left;
    struct Btree* right;
}Btree, *Pbtree;

#endif

      然后是tree.c,代码如下:

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


/**
 * 获取某个节点的值信息
 * @param  Pbtree  pNode   节点对应的指针信息
 *
 */
static void BtreeVisit(Pbtree pNode){
    if (NULL != pNode){
        printf("当前节点的值为: %d\n", pNode->val);
    }
}




/**
 * 构造一个tree节点,置左右指针为空,并且返回指向新节点的指针
 * @param  ElemType   值的类型
 * @return Pbtree     指向新节点的指针
 *
 */
static Pbtree BtreeMakeNode(ElemType target){
    Pbtree pNode = (Pbtree) malloc(sizeof(Btree));

    assert( NULL != pNode ); 

    pNode->val   = target;
    pNode->left  = NULL;
    pNode->right = NULL;
    
    return pNode;
}



/**
 * 插入一个节点信息
 * @param  ElemType      要插入的数据
 * @Param  Pbtree*       指向某一个节点的指针
 * @return Pbtree        指向新节点的指针 
 *
 */
Pbtree BtreeInsert(ElemType target, Pbtree* ppTree){
    Pbtree pNode;

    assert( NULL != ppTree ); 

    pNode = *ppTree;
    if (NULL == pNode){
        return *ppTree = BtreeMakeNode(target);
    }

    //相同则不允许插入
    if (pNode->val == target){
        return NULL;
    }else if (pNode->val > target){
        return BtreeInsert(target, &pNode->left);
    }else{
        return BtreeInsert(target, &pNode->right);
    }
}





/**
 * 前序遍历这个树
 *
 */
void BtreePreOrder(Pbtree pNode){
    if (NULL != pNode){
        BtreeVisit(pNode);
        BtreePreOrder(pNode->left);
        BtreePreOrder(pNode->right);
    }    
}

int main(int argc, char *argv[]){
    int i;
    int num[] = {21,43,2,6,88,9};
    Pbtree root = NULL; 
    
    for (i=0; i<sizeof(num)/sizeof(int); i++){
        BtreeInsert(num[i], &root);
    }

   
    BtreePreOrder(root);
   
    return 0;
}

  这里我们的数据在插入的时候是进行了一定的区分的,如果这个数字比较小,则会插入到左边,如果大于该数字,则会插入到右边,我们最终插入的结构应该是这样的:

      21
2          43
     6          88
         9

按照前序的输出顺序是:21 2 6 9 43 88

     

posted @ 2016-03-15 11:32  辛星  阅读(344)  评论(0编辑  收藏  举报