ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022-1-25数据结构总结(3)

2022-01-25 19:02:19  阅读:107  来源: 互联网

标签:25 wroot BiTree top 结点 Rch 2022 数据结构 Lch


二叉树的建立

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

struct Tree{
    int data;
    struct Tree *Lch, *Rch;
}BiTNode, *BiTree;

//递归创建二叉树
BiTNode *CreatTree(BiTree &wroot){
    int x;
    scanf("%d",&x);
    if(x==1){        //输入x=1时,表示继续递归创建结点
        wroot=(BiTNode *)malloc(sizeof(BiTNode));
        scanf("%d",&wroot->data);
        wroot->Lch=CreatTree(wroot->Lch);
        wroot->Rch=CreatTree(wroot->Rch);
    }
    else
        wroot=NULL;
    return wroot;
}

//先序(根左右)遍历
void Preorder(BiTree wroot){
    if(wroot!=NULL){
        printf("%d",wroot->data);
        Preorder(wroot->Lch);
        Preorder(wroot->Rch);
    }
}

//中序(左根右)遍历
void Midorder(BiTree wroot){
    if(wroot!=NULL){
        Midorder(wroot->Lch);
        printf("%d",wroot->data);
        Midorder(wroot->Rch);
    }
}

//后序(左右根)遍历
void Postorder(BiTree wroot){
    if(wroot!=NULL){
        Postorder(wroot->Lch);
        Postorder(wroot->Rch);
        printf("%d",wroot->data);
    }
}

//中序遍历的非递归算法,栈的思想
void Midorder2(BiTree wroot){
    struct Tree *s[255];
    int top=1;
    s[top]=wroot;
    do{
        while(s[top]!=NULL)
        {
            S[top+1]=s[top]->Lch;    //第一步,左进栈,遇到空才停止
            top++;
        }
        if(top>1){
            top--;
            print("%d",s[top]->data);    //第二步,退栈打印
            s[top]=s[top]->Rch;    //第三步,右进栈覆盖已经打印出的元素
        }
    }while(top!=1||s[top]!=NULL)    //栈底时,栈元素为空时,跳出循环
}

//求树深度
int treeDepth(BiTree T){
    if(T==NUll)
        return 0;
    else{
        int l=treeDepth(T->Lch);
        int r=treeDepth(T->Rch);
        return l>r?l+1:r+1;
    }

}

void TestTree(){
    BiTree root=NULL;
    wroot=CreatTree(root);
    //...........
}

​

 二叉树的层次遍历

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

//二叉树的结点(链式存储)
struct Tree{
    int data;
    struct Tree *Lch, *Rch;
}BiTNode, *BiTree;

//链式队列结点
typedef struct LinkNode{
    ElemType *data;    //这里存储的是树结点的指针,以便节省存储空间
    struct LinkNode *next;
}LinkNode;
 
typedef struct {
    LinkNode *front, *rear;
}LinkQueue;

//初始化队列,带头结点
void InitQueue(LinkQueue &Q){
    //初始时,front,rear都指向头结点,
    Q.rear=Q.front=(LinkNode *)malloc(sizeof(LinkNode));
    Q.front->next=NULL;
}

//判断队列是否为空
bool IsEmpty(LinkQueue Q){
    if(Q.rear=Q.front)
        return true;
    else
        return false;
}

//入队操作
bool EnQueue(LinkQueue &Q,ElemType x){
    LinkQueue *s=(LinkQueue *)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=NULL;
    Q.rear->next=s;    //新节点插入到队尾指针之后
    Q.rear=s;    //移动队尾指针位置
}
 
//出队操作
bool DeQueue(LinkQueue &Q, ElemType &x){
    if(Q.rear==Q.front)    //队空则报错
        return false;
    LinkQueue *p=Q.front->next;
    x=p->data;
    Q.front->next=p->next;
    if(Q.rear==p)    //最后一个结点出队
        Q.rear=Q.front;
    free(p);
    return true;
}
 
void LevelOrder(BiTree T){    
    LinkQueue Q;
    InitQueue(Q);    //初始化辅助队列
    BiTree P;    //新建立一个树结点接纳出队的结点
    EnQueue(Q,T)    //根结点入队
    while(!IsEmpty(Q)){
        DeQueue(Q,p);    //队头结点访问出队
        visit(p);    //访问出队结点
        if(p->Lch!=NULL)
             EnQueue(Q,p->Lch);    //左孩子入队
        if(p->Rch!=NULL)
             EnQueue(Q,p->Rch);    //右孩子入队
    }
}

标签:25,wroot,BiTree,top,结点,Rch,2022,数据结构,Lch
来源: https://blog.csdn.net/weixin_42637873/article/details/122690537

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有