作业二叉树

“the code is”

#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
/*typedef enum PointerTag{
    Link,Thread
};*/
typedef struct Node{
    char data;
    struct Node *left,*right;
    //PointTag LTag,RTag;(BiThrTree)
}*BiTree,BiNode;
stack<BiTree>s;
queue<BiTree>line;
void PreorderTraverse(BiTree T){
    if(T==nullptr){
        return;
    }
    else{
        cout<<T->data;
        PreorderTraverse(T->left);
        PreorderTraverse(T->right);
    }
}//前序遍历
void InorderTraverse(BiTree T){
    if(T==nullptr){
        return;
    }
    else{
        InorderTraverse(T->left);
        cout<<T->data;
        InorderTraverse(T->right);
    }
}//中序遍历
void PostorderTraverse(BiTree T){
    if(T==nullptr){
        return;
    }
    else{
        PostorderTraverse(T->left);
        PostorderTraverse(T->right);
        cout<<T->data;
    }
}//后序遍历
//非递归式遍历(中序)
void another(BiTree T){
    BiTree p=T;
    while(p||!s.empty()){
        if(p){
            //printf("%d",p->data)
            s.push(p);
            p=p->left;
        }
        else{
            BiTree q=s.top();
            printf("%c",q->data);
            s.pop();
            //p=p->right;(前序遍历非递归算法)
            p=q->right;
        }
    }
}//中序遍历二叉树的非递归算法
void queueTraverse(BiTree T){
    line.push(T);
    while(!line.empty()){
        BiTree p=line.front();
        printf("%c",p->data);
        line.pop();
        if(p->left!=nullptr){
            line.push(p->left);
        }
        if(p->right!=nullptr){
            line.push(p->right);
        }
    }
}//层次遍历二叉树
void CreateBiTree(BiTree &T){
    char n;
    cin>>n;
    if(n=='#'){
        T=nullptr;
    }
    else{
        T=new BiNode;
        T->data=n;
        CreateBiTree(T->left);
        CreateBiTree(T->right);
    }
}//先序遍历二建立二叉树
void CopyBiTree(BiTree T,BiTree &NewT){
    if(T==nullptr){
        NewT=nullptr;
        return;
    }
    else{
        NewT=new BiNode;
        NewT->data=T->data;
        CopyBiTree(T->left,NewT->left);
        CopyBiTree(T->right,NewT->right);
    }
}//复制二叉树递归法
int Depth(BiTree T){
    if(T==nullptr){
        return 0;
    }
    else{
        int m=Depth(T->left);
        int n=Depth(T->right);
        return max(m+1,n+1);
    }
}
int NodeCount(BiTree T){
    if(T==nullptr)
        return 0;
    else{
        return NodeCount(T->left)+NodeCount(T->right)+1;
    }
}//统计结点个数
int LeadCount(BiTree T) {
    if (T==nullptr)
        return 0;
    if (T->left == nullptr && T->right == nullptr) {
        return 1;
    } else
        return LeadCount(T->left) + LeadCount(T->right);
}
/*void InOrderThreading(BiTree &The,BiTree T){
    The=new BiThrTree;
    The->LTag=Link;The->RTag=Thread;
    The=The->right;
    if(!T)
    The=The->left;
    else{
    The->left=T;pre=The;
    InThreading(T);
    pre->right=The;pre->RTag=Thread;
    The->right=pre;
    }
}
void InThreading(BiThrTree){
   if(p){
     InTreading(p->left);
     if(!p->left){
     p->LTag=Thread;
     p->left=pre;
   }
   if(!pre->right){
     pre->RTag=Thread;
     pre->right=p;
   }
   pre=p;
   InTreading(p->right);
}*/
//二叉树线索化(中序遍历)
int main(){
    BiTree T,Thr;
    CreateBiTree(T);
    CopyBiTree(T,Thr);
    printf("前序遍历的顺序为:");
    PreorderTraverse(T);
    printf("\n");
    printf("中序遍历的顺序为:");
    InorderTraverse(T);
    printf("\n");
    another(T);
    printf("\n");
    printf("后序遍历的顺序为:");
    PostorderTraverse(T);
    printf("\n");
    printf("层次遍历的顺序为:");
    queueTraverse(T);
    printf("\n");
    int res= Depth(T);
    int cnt= NodeCount(T);
    printf("%d %d",res,cnt);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值