天勤数据结构笔记——第六章 树与二叉树(代码)

二叉树的链式存储结构 

typedef struct BTNode{
    char data;
    struct BTNode *lchild;
    struct BTNode *rchild;
}BTNode;

先序遍历

void preorder(BTNode *p){
    if(p!=NULL){
        visit(p);
        preorder(p->lchild);
        preorder(p->rchild);
    }
}

中序遍历

void preorder(BTNode *p){
    if(p!=NULL){
        preorder(p->lchild);
        visit(p);
        preorder(p->rchild);
    }
}

后序遍历

void preorder(BTNode *p){
    if(p!=NULL){
        preorder(p->lchild);
        preorder(p->rchild);
        visit(p);
    }
}

eg6-1 求出表达式的值 

int comp(BTNode *p){
    int A,B;
    if(p!=NULL){
        if(p->lchild!=NULL && p->rchild!=NULL){
            A=comp(p->lchild);
            B=comp(p->rchild);
            return op(A,B,p->data);
        }else{
            return p->data-'0';
        }
    }else{
        return 0;
    }
}

eg6-2 求二叉树的深度

int getDepth(BTNode *p){
    int LD,RD;
    if(p!=NULL){
        LD=getDepth(p->lchild);
        RD=getDepth(p->rchild);
        return (LD>RD?LD:RD)+1;
    }else{
        return 0;
    }
}

 eg6-3 按值查找

void search(BTNode *p,BTNode *&q,int key){
    if(p!=NULL){
        if(p->data==key){
            q=p;
        }else{
            search(p->lchild,q,key);
            if(q==NULL)
                search(p->rchild,q,key);
        }
    }
}

eg6-4 分别输出先序/中序/后续遍历的第k个值

int n=0;
//先序
void travel(BTNode *p,int k){
    if(p!=NULL){
        n++;
        if(k==n){
            cout<<p->data<<endl;
            return;
        } 
        travel(p->lchild,k);
        travel(p->rchild,k);
    }
}
//中序
void travel(BTNode *p,int k){
    if(p!=NULL){
        travel(p->lchild,k);
        n++;
        if(k==n){
            cout<<p->data<<endl;
            return;
        } 
        travel(p->rchild,k);
    }
}
//后序
void travel(BTNode *p,int k){
    if(p!=NULL){
        travel(p->lchild,k);
        travel(p->rchild,k);
        n++;
        if(k==n){
            cout<<p->data<<endl;
            return;
        }
    }
}

层次遍历

void level(BTNode *p){
    //初始化循环队列
    int front=rear=0;
    BTNode *que[maxSize];
    BTNode *q;//指向每次出队的结点
    if(p!=NULL){
        //根结点入队
        rear=(rear+1)%maxSize;
        que[rear]=p;
        //出队开始
        while(front!=rear){
            front=(front+1)%maxSize;
            q=que[front];
            visit(q);
            if(q->lchild!=NULL){
                rear=(rear+1)%maxSize;
                que[rear]=p->lchild;
            }
            if(q->rchild!=NULL){
                rear=(rear+1)%maxSize;
                que[rear]=p->rchild;
            }
        }
    }
}

eg6-5 求二叉树宽度

}BTNode;
typedef struct{
    BTNode *p;
    int lno;
}St;
int getWidth(BTNode *b){
    St que[maxSize];
    int front=rear=0;
    BTNode *q;
    int par_no;
    //层次遍历二叉树,给每个结点赋层号
    if(b!=NULL){
        ++rear;
        que[rear].p=b;
        que[rear].lno=1;
        while(front!=rear){
            front++;
            q=que[front].p;
            par_no=que[front].lno;
            if(q->lchild!=NULL){
                rear++;
                que[rear].p=q->lchild;
                que[rear].lno=par_no+1;
            }
            if(q->rchild!=NULL){
                rear++;
                que[rear].p=q->rchild;
                que[rear].lno=par_no+1;
            }
        }//最后par_no保留的是最大(后)一层的层号
        int max=0,n;
        for(int i=0;i<par_no;i++){//查找每一层
            n=0;
            if(int j=1;j<=rear;++j){
                if(que[j].lno==i) n++;
                if(max<n) max=n;
            }
        }
        return max;
    }else{
        return 0;//空树
    }
}

先序遍历的非递归算法

void preorderNonrecursion(BTNode *bt){
    if(bt!=NULL){
        BTNode *Stack[maxSize];
        int top=-1;
        Stack[++top]=bt;
        BTNode *p;
        while(top!=-1){
            p=Stack[top--];
            visit(p);
            if(p->rchild!=NULL){
                Stack[++top]=p->rchild;
            }
            if(p->lchild!=NULL){
                Stack[++top]=p->lchild;
            }
        }
    }
}

中序遍历的非递归算法

void inorderNonrecursion(BTNode *bt){
    if(bt!=NULL){
        BTNode *Stack[maxSize];
        int top=-1;
        BTNode *p=bt;
        while(top!=-1||p!=NULL){
            //左孩子存在则入栈
            while(p->lchild!=NULL){
                Stack[++top]=p;
                p=p->lchild;
            }
            //左孩子没了就输出,找右孩子
            if(top!=-1){
                p=Stack[top--];
                visit(p);p=p->rchild;
            }
        }
    }
}

后序遍历的非递归算法

void posorderNonrecursion(BTNode *bt){
    if(bt!=NULL){
        BTNode *Stack1[maxSize];int top1=-1;
        BTNode *Stack2[maxSize];int top2=-1;
        Stack1[++top1]=bt;
        BTNode *p=NULL;
        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(top2!=-1){
            p=Stack2[top2--];
            visit(p);
        }
    }
}

中序线索化

void InThread(TBTNode *p, TBTNode *&pre){
    if(p!=NULL){
        InThread(p->lchild,pre);
        if(p->lchild==NULL){
            p->lchild=pre;
            p->ltag=1;
        }
        if(pre!=NULL&&pre->lchild==NULL){
            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p;
        InThread(p->rchild,pre);
    }
}

遍历中序线索二叉树

//第一个
TBTNode *First(TBTNode *p){
    while(p->ltag==0){
        p=p->lchild;
    }
}
//下一个
TBTNode *Next(TBTNode *p){
    if(p->rtag==0)
        return First(p->rchild);
    else
        return p->rchild;
}
//打印整个中序序列
TBTNode Inorder(TBTNode *root){
    for(TBTNode *p=First(root);p!=NULL;p=Next(p)){
        visit(p);
    }
}

前序线索化

void preThread(TBTNode *p, TBTNode *&pre){
    if(p!=NULL){
        
        if(p->lchild==NULL){
            p->lchild=pre;
            p->ltag=1;
        }
        if(pre!=NULL&&pre->lchild==NULL){
            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p;
        if(p->ltag==0)
            InThread(p->lchild,pre);
        if(p->rtag==0)
            InThread(p->rchild,pre);
    }
}

 遍历前序线索二叉树

void preorder(TBTNode *root){
    if(root!=NULL){
        TBTNode *p=root;
        while(p!=NULL){
            while(p->ltag==0){
                visit(p);
                p=p->lchild;
            }
            visit(p);
            p=p->rchild;
        }
    }
}

后序线索化

void posThread(TBTNode *p, TBTNode *&pre){
    if(p!=NULL){
        InThread(p->lchild,pre);
        InThread(p->rchild,pre);
        if(p->lchild==NULL){
            p->lchild=pre;
            p->ltag=1;
        }
        if(pre!=NULL&&pre->lchild==NULL){
            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p;
    }
}

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值