Tree(3)--二叉树的实现及四种遍历(递归/非递归)

1.二叉树的实现

按前序遍历进行输入,#表示空树

struct node{
    char data;
    struct node *left, *right;
};

class tree{
public:
    tree();
    ~tree();
    node *getRoot(){return root;}

    int Depth(node *);

    void PreOrder(node * );
    void InOrder(node *);
    void PostOrder(node *);
    void LayerTravel(node *);
    void PrintLevel(node *, int);

    void NonrePreOrder(node *);
    void NonreInOrder(node *);
    void NonrePostOrder(node *);
    void NonreLayerTravel(node *);

private:
    node* root;
    node* creat();
};

构造函数

tree::tree(){
    this->root = creat();
}

creat()方法

node* tree::creat(){
    node* root;
    char ch;
    cout<<"Input:"<<endl;
    cin>>ch;
    if(ch == '#')root = NULL;
    else{
        root = new node;
        root->data = ch;
        root->left = creat();
        root ->right = creat();
    }
    return root;
}

2.二叉树的遍历

1.递归前序遍历

void tree::PreOrder(node* root){
     if(root!=NULL){
        cout<<root->data<<" ";
        PreOrder(root->left);
        PreOrder(root->right);
     }
}

2.递归中序遍历

void tree::InOrder(node* root){
     if(root!=NULL){
        InOrder(root->left);
        cout<<root->data<<" ";
        InOrder(root->right);
     }
}

3.递归后序遍历

void tree::PostOrder(node* root){
     if(root!=NULL){
        PostOrder(root->left);
        PostOrder(root->right);
        cout<<root->data<<" ";
     }
}

4.递归层次遍历

递归求树的高度

int tree::Depth(node *root){
    if(root==NULL)return 0;
    return 1 + max(Depth(root->left),Depth(root->right));
}
void tree::LayerTravel(node* root){
     if(root!=NULL){
        int depth = Depth(root);
        int i;
        for(i=1;i<=depth;i++){
         PrintLevel(root,i);
         cout<<endl;
        }
     }
}
void tree::PrintLevel(node* root,int level){
    if(root == NULL || level < 1) return;
    if(1==level){
        cout<<root->data<<" ";
        return;
    }
    PrintLevel(root->left,level-1);
    PrintLevel(root->right,level-1);
}

5.非递归前序遍历

void tree::NonrePreOrder(node* root){
    stack<node*> s;
    node* p = root;
    do{
        while(p){
            cout<<p->data<<" ";
            s.push(p);
            p = p->left;
        }
        if(!s.empty()){
            p = s.top();
            s.pop();
            p = p->right;
        }
    }while(p||!s.empty());
}

6.非递归中序遍历

void tree::NonreInOrder(node* root){
    stack<node*> s;
    node* p = root;
    do{
        while(p){s.push(p); p = p->left;}
        if(!s.empty()){
            p=s.top();
            s.pop();
            cout<<p->data<<" ";
            p = p->right;
        }
    }while(p||!s.empty());
}

7.非递归后序遍历

这里写图片描述
这里写图片描述

void tree::NonrePostOrder(node* root){
   if (root == NULL) return;
    stack<node*> s;
    s.push(root);
    node* head = root;
    while (!s.empty()){
        node* t = s.top();
        if (!t->left&&!t->right || t->left == head || t->right == head){
            cout<<t->data<<" ";
            s.pop();
            head = t;
        }
        else{
            if (t->right)s.push(t->right);
            if (t->left)s.push(t->left);
        }

    }
}

8.非递归层次遍历

void tree::NonreLayerTravel(node* root){

    if (root == NULL)return;
    queue<node*> q;
    q.push(root);
    while (!q.empty()){
        //计算当前队列中含有多少元素
        int size = q.size();
        //从头部依次取出size个元素
        for (int i = 0; i < size; i++){
            root = q.front();
            q.pop();
            cout<<root->data<<" ";
            //将下一层的元素塞入队列
            if (root->left)q.push(root->left);
            if (root->right)q.push(root->right);
        }
    }
}

3.完整代码

头文件a.h

#ifndef A_H_INCLUDED
#define A_H_INCLUDED
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
/
struct node{
    char data;
    struct node *left, *right;
};

class tree{
public:
    tree();
    ~tree();
    node *getRoot(){return root;}

    int Depth(node *);

    void PreOrder(node * );
    void InOrder(node *);
    void PostOrder(node *);
    void LayerTravel(node *);
    void PrintLevel(node *, int);

    void NonrePreOrder(node *);
    void NonreInOrder(node *);
    void NonrePostOrder(node *);
    void NonreLayerTravel(node *);

private:
    node* root;
    node* creat();
};

tree::tree(){
    this->root = creat();
}


node* tree::creat(){
    node* root;
    char ch;
    cout<<"Input:"<<endl;
    cin>>ch;
    if(ch == '#')root = NULL;
    else{
        root = new node;
        root->data = ch;
        root->left = creat();
        root ->right = creat();
    }
    return root;
}
int tree::Depth(node *root){
    if(root==NULL)return 0;
    return 1 + max(Depth(root->left),Depth(root->right));
}

void tree::PreOrder(node* root){
     if(root!=NULL){
        cout<<root->data<<" ";
        PreOrder(root->left);
        PreOrder(root->right);
     }
}

void tree::InOrder(node* root){
     if(root!=NULL){
        InOrder(root->left);
        cout<<root->data<<" ";
        InOrder(root->right);
     }
}

void tree::PostOrder(node* root){
     if(root!=NULL){
        PostOrder(root->left);
        PostOrder(root->right);
        cout<<root->data<<" ";
     }
}

void tree::LayerTravel(node* root){
     if(root!=NULL){
        int depth = Depth(root);
        int i;
        for(i=1;i<=depth;i++){
         PrintLevel(root,i);
         cout<<endl;
        }
     }
}

void tree::PrintLevel(node* root,int level){
    if(root == NULL || level < 1) return;
    if(1==level){
        cout<<root->data<<" ";
        return;
    }
    PrintLevel(root->left,level-1);
    PrintLevel(root->right,level-1);

}


void tree::NonrePreOrder(node* root){
    stack<node*> s;
    node* p = root;
    do{
        while(p){
            cout<<p->data<<" ";
            s.push(p);
            p = p->left;
        }
        if(!s.empty()){
            p = s.top();
            s.pop();
            p = p->right;
        }
    }while(p||!s.empty());
}

void tree::NonreInOrder(node* root){
    stack<node*> s;
    node* p = root;
    do{
        while(p){s.push(p); p = p->left;}
        if(!s.empty()){
            p=s.top();
            s.pop();
            cout<<p->data<<" ";
            p = p->right;
        }
    }while(p||!s.empty());
}

void tree::NonrePostOrder(node* root){
   if (root == NULL) return;
    stack<node*> s;
    s.push(root);
    node* head = root;
    while (!s.empty()){
        node* t = s.top();
        if (!t->left&&!t->right || t->left == head || t->right == head){
            cout<<t->data<<" ";
            s.pop();
            head = t;
        }
        else{
            if (t->right)s.push(t->right);
            if (t->left)s.push(t->left);
        }

    }
}

void tree::NonreLayerTravel(node* root){

    if (root == NULL)return;
    queue<node*> q;
    q.push(root);
    while (!q.empty()){
        //计算当前队列中含有多少元素
        int size = q.size();
        //从头部依次取出size个元素
        for (int i = 0; i < size; i++){
            root = q.front();
            q.pop();
            cout<<root->data<<" ";
            //将下一层的元素塞入队列
            if (root->left)q.push(root->left);
            if (root->right)q.push(root->right);
        }
    }
}
/
#endif // A_H_INCLUDED

测试代码main.cpp

#include "a.h"
#include <iostream>
using namespace std;
int main(){

    tree *mytree = new tree();
    cout<<"Creat sucessfully!!"<<endl;
    node* myroot = mytree->getRoot();
    cout<<"-------------------------------------"<<endl;
    cout<<"The depth is:"<<mytree->Depth(myroot)<<endl;
    cout<<"-------------------------------------"<<endl;
    cout<<"Recursive Traversal"<<endl;
    cout<<" Preorder Traversal:  ";
    mytree->PreOrder(myroot);
    cout<<endl;
    cout<<"  Inorder Traversal:  ";
    mytree->InOrder(myroot);
    cout<<endl;
    cout<<"Postorder Traversal:  ";
    mytree->PostOrder(myroot);
    cout<<endl;
    cout<<"    Layer Traversal:  ";
    cout<<endl;
    mytree->LayerTravel(myroot);
    cout<<endl;
    cout<<"-------------------------------------"<<endl;
    cout<<"Nonrecursive Traversal"<<endl;
    cout<<" Preorder Traversal:  ";
    mytree->NonrePreOrder(myroot);
    cout<<endl;
    cout<<"  Inorder Traversal:  ";
    mytree->NonreInOrder(myroot);
    cout<<endl;
    cout<<"Postorder Traversal:  ";
    mytree->NonrePostOrder(myroot);
    cout<<endl;
    cout<<"    Layer Traversal:  ";
    mytree->NonreLayerTravel(myroot);
    cout<<endl;
    cout<<"-------------------------------------"<<endl;
    return 0;
};

测试结果(要构造如下所示的二叉树)
这里写图片描述
按如下进行输入(按前序遍历进行输入,#表示空树)
这里写图片描述
结果如图
这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我已经根据您提供的新规则对代码进行了修改。以下是更新后的代码: ```python import os import csv # 定义物种属的字典 species_dict = { "AFL": "Arthrobotrys", "Aoli": "Arthrobotrys", "Acon": "Arthrobotrys", "Airi": "Arthrobotrys", "Amus": "Arthrobotrys", "Apse": "Arthrobotrys", "Asin": "Arthrobotrys", "Asph": "Arthrobotrys", "Aver": "Arthrobotrys", "DEN": "Dactylellina", "Dcio": "Dactylellina", "Dcio1": "Dactylellina", "Dcio2": "Dactylellina", "Ddre": "Dactylellina", "Dhap": "Dactylellina", "Dlep": "Dactylellina", "Dpar": "Dactylellina", "Dque": "Dactylellina", "Dtib": "Dactylellina", "Dste": "Drechslerella", "Ddac": "Drechslerella", "Dcoe": "Drechslerella", "Dbro": "Drechslerella" } # 定义进化树分类的规则 def classify_gene_tree(tree): species = [] # 提取进化树中的物种 for line in tree.splitlines(): if ":" in line: species_name = line.split(":")[0].strip() species.append(species_name) # 判断物种属的组合 if ("Arthrobotrys" in species and "Dactylellina" in species) and ("Drechslerella" in species): return "tree1" elif ("Arthrobotrys" in species and "Drechslerella" in species) and ("Dactylellina" in species): return "tree2" elif ("Dactylellina" in species and "Drechslerella" in species) and ("Arthrobotrys" in species): return "tree3" else: return "other" # 定义进化树文件夹路径和输出CSV文件路径 tree_folder = "/home/dengwei/NTF_data/class_tree/rotted_gene_tree" output_csv = "/home/dengwei/NTF_data/class_tree/classification.csv" # 创建分类文件夹 folder_names = ["tree1", "tree2", "tree3", "other"] for folder_name in folder_names: folder_path = os.path.join(tree_folder, folder_name) os.makedirs(folder_path, exist_ok=True) # 遍历进化树文件夹中的所有文件 tree_files = os.listdir(tree_folder) classification_results = [] for tree_file in tree_files: # 读取进化树文件内容 tree_file_path = os.path.join(tree_folder, tree_file) with open(tree_file_path, "r") as f: tree_content = f.read().strip() # 对进化树进行分类 tree_classification = classify_gene_tree(tree_content) # 将进化树移动到相应的分类文件夹中 target_folder = os.path.join(tree_folder, tree_classification) target_path = os.path.join(target_folder, tree_file) os.rename(tree_file_path, target_path) # 记录进化树的分类结果 classification_results.append([tree_file, tree_classification]) # 生成CSV文件 with open(output_csv, "w", newline="") as f: writer = csv.writer(f) writer.writerow(["Tree File", "Classification"]) writer.writerows(classification_results) print("分类完成,已生成CSV文件。") ``` 请确保将代码中的文件夹路径和文件名替换为您实际使用的路径和名称。运行代码后,它将根据您提供的分类规则将进化树文件移动到相应的文件夹中,并生成一个名为"classification.csv"的CSV文件,其中记录了每棵进化树的分类结果。 希望这次能满足您的需求!如果您有任何其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值