C语言建树

来源:互联网 发布:r语言和c语言 编辑:程序博客网 时间:2024/05/29 15:38

话不多说,先看代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>struct TreeNode{    //结构体用来储存树结点,包括节点的值data,分别指向左孩子右孩子的指针;    int data;    struct TreeNode *left, *right;};void SetTree(struct TreeNode **root, int val){//建树函数,传参为根节点的地址,新增数;    struct TreeNode *t;                      //储存新结点;    t=(struct TreeNode *)malloc(sizeof(struct TreeNode));    t->data=val;    t->left=NULL;    t->right=NULL;    if((*root)==NULL){            //if根结点为空,把新增节点设为根结点;        (*root)=t;        return;    }    if((*root)->data>val) SetTree(&((*root)->left), val);//新增值小于该结点的值,放到左孩子,递归;    else SetTree(&((*root)->right), val);//大于,右孩子,递归;}void ShowTree(struct TreeNode *root){  //打印函数;  中序遍历;    if(root==NULL){        return;    }    //left;    ShowTree(root->left);    //root;    printf("%d ",root->data);    //right;    ShowTree(root->right);}int main(){    int N;    int val;    struct TreeNode *root;    root=NULL;    scanf("%d",&N);    while(N--){        scanf("%d",&val);        SetTree(&root, val);    }    ShowTree(root);    return 0;}

注意:上边代码,树的打印顺序是中序遍历;


有中则必有先后;

树的遍历有三种方法,前序遍历,中序遍历,后序遍历;

如上图

前序遍历(DLR)是先遍历根结点,然后遍历左子树,最后遍历右子树。

A B D G H E C K F I J;

中序遍历(LDR)是先遍历左子树,然后遍历根结点,最后遍历右子树。

G D H B E A C K F I J;

后序遍历(LRD)是先遍历左子树,然后遍历右子树,最后遍历根节点。

G H D E B K J I F C A;

其实代码很好写的,中序遍历就不再重复写了,下面写前序遍历和后序遍历;

前序遍历:

void DLRShowTree(struct TreeNode *root){  //打印函数;  前序遍历;    if(root==NULL){        return;    }    //root;    printf("%d ",root->data);    //left;    DLRShowTree(root->left);    //right;    DLRShowTree(root->right);}

后序遍历:

void LRDShowTree(struct TreeNode *root){  //打印函数;  后序遍历;    if(root==NULL){        return;    }    //left;    LRDShowTree(root->left);    //right;    LRDShowTree(root->right);    //root;    printf("%d ",root->data);}