• 二叉树的遍历及实现 沧海


    树是一种非线性的二维数据结构。

        这里要说的是一种特殊的二叉树,叫对分查找树。特点在于:左子树的所有值都比根节点小,右子树的所有值都比根节点大。

        对分查找树的三种遍历:

        中序遍历(inOrder)        遍历左子树;处理节点中的值;遍历右子树。

        前序遍历(preOrder)     处理节点中的值;遍历左子树;遍历右子树。

        后序遍历(postOrder)   遍历左子树;遍历右子树;处理节点中的值。

    注意的是,对分查找树中序遍历的结果是对数列进行升序排列。因此中序遍历又叫二叉树排序。

       下面的程序说明对分查找树的生成和三种遍历的实现。

    /*author:zhanglin*/

    #include
    #include
    #include

    struct treeNode{
     struct treeNode *leftPtr;
     int data;
     struct treeNode *rightPtr;
    };

    typedef struct treeNode TreeNode;
    typedef TreeNode *TreeNodePtr;

    void insertNode(TreeNodePtr *, int);
    void inOrder(TreeNodePtr);
    void preOrder(TreeNodePtr);
    void postOrder(TreeNodePtr);

    int main(){
     int i, item;
     TreeNodePtr rootPtr= NULL;

     srand(time(NULL));

     /*insert random values between 1 and 15 in the tree*/
     printf("the number being placed in the tree are:\n");
     for(i=0; i<10;i++){
      item = rand()%15;
      printf("%3d", item);
      insertNode(&rootPtr, item);
     }

     /*traverse the tree in inOrder*/
     printf("\ntraverse the tree in inOrder\n");
     inOrder(rootPtr);

     /*traverse the tree in preOrder*/
     printf("\ntraverse the tree in preOrder\n");
     preOrder(rootPtr);

     /*traverse the tree in postOrder*/
     printf("\ntraverse the tree in postOrder\n");
     postOrder(rootPtr);

     return 0;

    }

    void insertNode(TreeNodePtr *ptr, int value){
     if(*ptr==NULL){
      *ptr = (TreeNodePtr)malloc(sizeof(TreeNode));

      if(*ptr!=NULL){
                (*ptr)->data = value;
       (*ptr)->leftPtr = NULL;
       (*ptr)->rightPtr = NULL;
      }else{
       printf("\nerror. No memory available\n");
      }
     }else{
      if(value<(*ptr)->data){
       insertNode(&((*ptr)->leftPtr), value);
      }else if(value>(*ptr)->data){
                insertNode(&((*ptr)->rightPtr), value);
      }else{
                printf("\nduplicate data\n");
      }
     }
    }

    void inOrder(TreeNodePtr ptr){
     if(ptr!=NULL){
       inOrder(ptr->leftPtr);
       printf("%3d", ptr->data);
       inOrder(ptr->rightPtr);
     }
    }

    void preOrder(TreeNodePtr ptr){
     if(ptr!=NULL){
       printf("%3d", ptr->data);
       preOrder(ptr->leftPtr);
       preOrder(ptr->rightPtr);
     }
    }

    void postOrder(TreeNodePtr ptr){
     if(ptr!=NULL){
       postOrder(ptr->leftPtr);
       postOrder(ptr->rightPtr);
       printf("%3d", ptr->data);
     }
    }

    专注于企业信息化,最近对股票数据分析较为感兴趣,可免费分享股票个股主力资金实时变化趋势分析工具,股票交流QQ群:457394862
  • 相关阅读:
    线性表之链式存储结构
    最大公约数:辗转相除法
    字符串系列之:逆序输出字符串
    链表有关的常见面试题
    从数组中找出最大的和最小的数
    C语言实现简单线程池
    线性表之顺序存储结构
    新学了姜葱豆腐
    渗透1
    MySQL注入中新Tips
  • 原文地址:https://www.cnblogs.com/omygod/p/554699.html
Copyright © 2020-2023  润新知