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

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

    对分查找树的三种遍历:

    中序遍历(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);
 }
}

posted on 2006-11-08 23:31  沧海-重庆  阅读(758)  评论(0编辑  收藏  举报