数据结构——树

1.树的存储结构

(1)孩子存储结构

//二叉树孩子存储结构
typedef struct Branch
{
    int CIdx;
    Branch* next;
}Branch;

(2)二叉顺序存储结构

(3)二叉链式存储结构

//二叉链式存储结构
typedef struct BTNode
{
        int data;
        BTnode* lchild;
        BTnode* rchild;
}BTNode;

(4)树的孩子兄弟存储结构

//二叉树孩子兄弟存储结构
typedef struct BTNode
{

    int data;
    BTnode* child;
    BTnode* sbling;
}BTNode;

2.树,二叉树,森林的相互转化

(1)二叉树与树的互相转换

(2)森林与二叉树的转换

 3. 树,二叉树,森林的遍历

 

4.二叉树遍历代码

//二叉树递归遍历代码
void r(BTNode* p)
{
    if(p!=NULL)
        {
            vist(p);
            r(p->lchild);
            r(p->rchild);
        }
}
//二叉树先序非递归遍历
void preoerderNonrecursion(BTNode* bt)
{
    if(btt!=NULL)
        {
            BTNode* Stack[maxSize];
            int top=-1;
            BTNode* p=NULL;
            Stack[++top]=bt;
            while(top!=-1)
                {
                    p=Stack[top--];
                    visit(p);
                    if(p->child!=NULL)
                        Stack[++top]=p->rchild;
                    if(p->lchild!=nuLL)
                        Stack[++top]=p->lchild;      
                 }
                frre(p);
        }
}
//先序:   1,2,4,5,3,6,8,7
//逆后序: 1,3,7,6,8,2,5,4
//后序:   4,5,2,8,6,7,3,1
//二叉树后续非递归
void postorderrecursion(BTNode* bt)
{
    if(bt!==NULL)
    {
        BTNode* stack1[maxSize];int top1=-1;
        BTNode* stack1[maxSize];int top2=-1;
        BTode* p=NULL;
        stack1[++top1]=bt;
        while(top1!=-1)
        {
            p=stack1[top1--];
            stack2[++top2]=p;
            if(p->lchild!=NULL)
                stack1[++top1]=p->lchild;
            if(p->rchild!=NULL)
                stack1[++top1]=p->rchild;
        }
        while(top1!=-1)
        {
            p=stack2[top--];
            visit(p);
        }
    }
}

 

//二叉树中序非递归
void inorderNonrecursion(BTNode* bt)
{
    if(bt!=NULL)
    {
        BTNode* stack[maxSize];int top=-1;
        BTNode* p=NULL;
        p=bt;
        while(top!=-1||p!=NULL)
        {
            while(p!NULL)
            {
                stack[++top]=p;
                p=p->lchild;
            }
            if(top!=-1)
            {
                p=stack[top--];
                visit(p);
                p=p->rchild;
            }
        }
    }
}

 

//二叉树广度优先遍历(层次遍历)
void level(BTNode* bt)
{
    if(bt!=NULL)
    {
        int front,rear;
        BTnode* que[maxSize];
        front=rear=0;
        BTNode* p;
        rear=(rear+1)%maxSize;
        que[rear]=bt;
        while(front!=rear)
        {
            front=(front+1)%maxSize;
            p=que[front];
            visit(p);
            if(p->lchild!=NULL)
            {

                rear=(rear+1)%maxSize;
                que[rear]=p->lchild;
            }
            if(p->rchild!=NULL)
            {
                rear=(rear+1)%maxSize;
                que[rear]=p->rchild;

            }
        }

    }
}

5.树的遍历

 

//树的结构
typedef struct Branch
{
    int CIdx;
    Branch* next;

}Branch;

typedef struct
{
    int data;
    Branch* first;

}TNode;
//树的先序遍历
void peroder(TNode* p,TNode tree[])
{
    if(p!=NULL)
    {
        visit(p);
        Branch* q;
        q=p->first;
        while(q!=NULL)
        {
            preoder(&tree[q->CIdx],tree)
            q=q->next;
        }
    }
}

 

///树的广度优先(层次)遍历
void level(TNode* tn,TNode tree[])
{
    int front,rear;
    TNode* que[maxSize];
    front=rear=0;
    TBode* p;
    if(tn!=rear)
    {
        rear=(rear+1)%maxSize;
        que[rear]=tn;
        while(front!=rear)
        {
            front=(front+1)%maxSize;
            p=que[front];
            visit(p);
            Branch* q=p->first;
            while(q!=NULL)
            {

                rear=(rear+1)%maxSize;
                que[tree]=&tree[q->CIdx];
                q=q->next;
            }
        }
    }
}

 

6.线索二叉树

//线索二叉树
typedef struct TBTNode
{
    int data;
    int ltag;
    int rtag;
    TBTNode* lchild;
    TBTNode* echild;
}TBTNode;
//中序线索化
void inThread(TBTNode* p,TBTNode*& pre)

{
    if(p!NULL)
    {

        inThread(p->lchild,pre);
        if(p->child==NULL)
        {
            p->lchild=pre;
            p-ltag=1;

        }
        if(pre!=NULL&&pre->child==NULL)
        {

            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p;
        inThread(p->rchild,pre);
    }
}

 

//前序线索化void preThread(TBTNode* p,TBTNode*& pre)
{
    if(p!=NULL)
    {
        if(p->lchild==NULL)
        {
            p->lchild=pre;
            p->ltag=1;

        }
        if(pre!=NULL&&pre->rchild==NULL)
        {
            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p;
        preThread(p->lchild,pre);
        preThread(p->rchild,pre);
    }
}
//后序线索
void postThread(TBTNode* p,TBTNode* &pre)
{
    if(p!=NULL)
    {

        postThread(p->lchild,pre);
        postThread(p->rchild,pre);
        if(p->lchild==NULL)
        {

            p->lchild=pre;
            p->ltag=l;

        }
        if(pre!=NULL&&pre->rchild==NULL)
        {

            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p;
    }
}

 

7.建树代码

//建树
BTNode*createBT ( char pre[],char in[],int L1,int R1,int L2,int R2 )
{
    if( L1>R1 )
        return NULL;
    BTNode* s=( BTNode* )malloc( sizeof ( BTNode ) );
    s->lchild=s->rchild=NULL;
    s->data=pre[L1];
    int i;
    for( i=L2;i<R2;i++ )
        if( int [i]==pre[L1] )
            break;
    s->lchild=createBT( pre , in , L1+1 , L1+i-L2,i-1,L2 );
    s->rchild=createBT( pre, in , L1+i-L2+1 , R1 , i+1 , R2 );
    return s;
}

//
BTNode* createBT2(char post[] ,char in[],int L1,int R1,int L2,int R2)
{
    if(L1>R1)
        return NULL;
    BTNode*s=( BTNode* )malloc(sizeof(BTNode));
    s->lchild=s->rchild=NULL;
    s->data=post[R1];
    int i;
    for(i=L2;i<=R2;++i)
        if(in[i]==post[R1])
            break;
    s->lchild=createBT2(post,in,L1,L1+i-L2-1,L2,i-1);
    s->rchild=createBT2((post,in,L1+i-L2,R1-1,i+1,R2);
    return s;
}



BTNode* createBT3(char level[],char in[],int n,int L,int R)
{
    if(L>R)
        return NULL;
    BTNode*s=(BTNode*)malloc(sizeof(BTNode));
    s->lchild=s->rchild=NULL;
    s->data=level[0];
    int i=search(in,level[0],L,R);
    int LN=i-L,char Llevel[LN];

    int RN=R-i;charRlevel[RN] ;
    getSubLevel(LLevel,level,in,n,L,i-1);
    getSubLevel(RLevel,level,in,n,i+1,R);
    s->lchild=createBT3(LLevel,in,LN,L,i-1);
    s->rchild=createBT3(RLevel,in,RN,i+1,R);
    return s;
}

 

8.二叉树遍历顺序问题

int search(char arr[],char key,int L,int R)
{
    int idx;
    for(idx=L;idx<=R;++idx)
        if(arr[idx]==key)
            return idx;
    return -1;
}


//
void getSubLevel(char subLeve[],char level[];char in[],int L;int R)
{
    int k=0;
    for(int i=0;i<n;++i)
        if(search(in,level[i],L,R)!=-1)
            subLevel([k++]=level[i]);
}

9.树的应用——表达式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值