• step3 . day7数据结构之二叉顺序数的创建和二叉树的栈形式遍历


    1。最近从网易云课堂学习了一个老师的数据结构相关的知识,了解到数据结构的应用和二分查找之间的关系,就自己想着写一个创建二叉顺序数和利用栈对二叉顺序树进行顺序输出的代码,终于一个周末的时间写完了。

    2.写代码的重点在于实现逻辑,由于递归思想和逻辑的混乱,代码容易出现段错误或者,偶尔输出一半的结果,梳理了好久,结合前序、中序输出推导出树的结构,从而寻找代码问题的形式,终于搞定了

    3.因此代码思想远比代码实现更重要,而代码的思想又需要扎实的基本功,继续努力。。。,

     4.添加:二叉排序树的查找,利用比较大小,判断是在左右子树位置,从而判断有无

      删除:查找删除位置,如果是叶子节点,修改其根节点的孩子指针,如果是根节点,将其左子树最大、或者右子树最小替换到该位置,删除替换元素


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    typedef struct _node{
    int date;
    struct _node * lchild;
    struct _node * rchild;
    struct _node * parent;
    }btreenode;

    void btreenode_add(btreenode * root,btreenode * temp){
    btreenode *temproot = root; //根节点临时变量

    if(temp->date > temproot->date){ //对比节点数据域
    if(temproot->rchild != NULL){ //寻找插入点
    temproot = temproot->rchild;
    btreenode_add(temproot,temp); //插入点不为空,递归调用
    }
    else
    temproot->rchild = temp;
    }
    else{
    if(temproot->lchild != NULL){
    temproot = temproot->lchild;
    btreenode_add(temproot,temp);
    }
    else
    temproot->lchild = temp;
    }


    }

    //二叉顺序树的创建
    btreenode * btreenode_creat(int num){
    if(num <= 0) return NULL; //创建节点数小于0退出

    srand(time(NULL)); //随机数函数,创建头节点并初始化
    btreenode * root = (btreenode *)malloc(sizeof(btreenode));
    memset(root,'',sizeof(root));
    root->date = rand()%100+1;

    root->lchild = root->rchild = root->parent = NULL;

    int i;
    for(i=2;i<=num;i++){ //依次添加节点
    btreenode * temp = (btreenode *)malloc(sizeof(btreenode));
    memset(temp,'',sizeof(temp));
    temp->date = (rand()%100+1);

    btreenode_add(root,temp);//调用添加节点函数
    }

    return root; //返回根节点
    }

    //二叉树的中序遍历
    void mid_show(btreenode * root){

    if(root->lchild != NULL)
    mid_show(root->lchild);

    printf("%d ",root->date);

    if(root->rchild != NULL)
    mid_show(root->rchild);
    }
    //二叉树的先序遍历
    void fir_show(btreenode * root){

    printf("%d ",root->date);

    if(root->lchild != NULL)
    fir_show(root->lchild);

    if(root->rchild != NULL)
    fir_show(root->rchild);
    }
    typedef struct _linkstack{ //栈结构体
    btreenode * node;
    struct _linkstack *next;
    }linkstack;

    linkstack * create(){
    linkstack * ls = (linkstack *)malloc(sizeof(linkstack));
    memset(ls,'',sizeof(ls));
    ls->next = NULL;
    ls->node = NULL;

    return ls;
    }
    int is_empty(linkstack * ls){
    return ls->next ==NULL ? 1 : 0;
    }

    void push(linkstack * ls,btreenode *node){
    linkstack * temp = create();
    temp->node = node;

    linkstack * lstemp = ls;
    while(lstemp->next != NULL){ lstemp = lstemp->next;}
    lstemp->next = temp;
    }

    linkstack * pop(linkstack * ls){
    if(is_empty(ls)){
    printf("stact_is_empty ");
    return NULL;
    }

    linkstack *temp,*p,*q;
    temp = ls;
    while(temp->next->next != NULL) temp =temp->next;
    p = temp;
    q = p->next;
    p->next = NULL;
    return q;
    }

    //二叉树使用栈实现中序输出
    void stact_show(linkstack * ls,btreenode * root){
    btreenode * temp = root;
    push(ls,temp); //根节点压栈
    while(temp->lchild != NULL){ //左孩子不为空压栈
    temp = temp->lchild;
    push(ls,temp);
    }
    while( !(is_empty(ls))){//栈非空出站

    temp = pop(ls)->node;
    printf("%d ",temp->date);
    if(temp->rchild !=NULL) //出站节点有右孩子,递归调用自身压栈出栈
    stact_show(ls,temp->rchild);
    }
    }
    int main(int argc, const char *argv[])
    {
    btreenode * root = btreenode_creat(10);
    printf("1first show. ************************ ");
    fir_show(root);
    printf(" ");

    printf("2.midddle show ************************ ");
    mid_show(root);
    printf(" ");


    printf("3.stact_show ************************ ");
    linkstack * ls = create();
    stact_show(ls,root);
    printf(" ");
    return 0;
    }

  • 相关阅读:
    HDU 1813 Escape from Tetris
    BZOJ 2276 Temperature
    BZOJ 4499 线性函数
    BZOJ 3131 淘金
    HDU 5738 Eureka
    POJ 2409 Let it Bead
    POJ 1286 Necklace of Beads
    POJ 1696 Space Ant
    Fox And Jumping
    Recover the String
  • 原文地址:https://www.cnblogs.com/huiji12321/p/11262880.html
Copyright © 2020-2023  润新知