zoukankan      html  css  js  c++  java
  • 辛星算法教程第一节即二叉树的递归遍历

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

        首先是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
    ", 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

         

  • 相关阅读:
    什么叫“全力以赴”?
    Hibernate 异常 —— Unable to instantiate default tuplize
    也许用得着的英文短语(持续整理)
    也许用得着的英文句子(持续更新)
    iPhone(iOS设备) 无法更新或恢复时, 如何进入恢复模式
    poj 2778 DNA Sequence(AC自动机 + 矩阵快速幂)
    hdu 3974 线段树 将树弄到区间上
    hdu 2865 Polya计数+(矩阵 or 找规律 求C)
    Polya计数
    poj 2888 Magic Bracelet(Polya+矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/xinxing/p/5278708.html
Copyright © 2011-2022 走看看