zoukankan      html  css  js  c++  java
  • 【数据结构上机练习】6. 二叉树的简单操作(1)

    上机4.1的题目

    直接上代码:

      1 //============================================================================
      2 // Name        : 上机4.1  tree.cpp
      3 // Author      :
      4 // Version     :
      5 // Copyright   : Your copyright notice
      6 // Description : Hello World in C++, Ansi-style
      7 //============================================================================
      8 /***
      9  * 1、    定义链接存储的二叉树类。
     10 2、    实验验证如下算法的正确性、各种功能及指标:
     11 1)创建一棵二叉树,并对其初始化;
     12 2)先根、中根、后根遍历二叉树;
     13 3)在二叉树中搜索给定结点的父结点;
     14 4)搜索二叉树中符合数据域条件的结点;
     15 5)从二叉树中删除给定结点及其左右子树。
     16 3、    为便于观察程序的运行结果,
     17     设计的输出函数能在输出设备上以图形或表格或其它直观的形式展现、存储计算结果。
     18 4、    测试程序时,对所有输入变量取遍各种有代表性的值。
     19 5、    为了增强程序的可读性,程序中要有适当的注释。
     20  *
     21  */
     22 #include <iostream>
     23 
     24 using namespace std;
     25 
     26 typedef struct BinTreeNode{
     27     char data;
     28     struct BinTreeNode * left,*right;
     29 }BinTreeNode;
     30 
     31 class BinTree{
     32 private:
     33     BinTreeNode *root;
     34 public:
     35     BinTree(){root = NULL;}
     36     BinTree(BinTreeNode & temp){
     37         root = &temp;
     38         temp.left = NULL;
     39         temp.right = NULL;
     40     }
     41     BinTreeNode * creat(){ //递归创建树
     42         char t;
     43         cin>>t;
     44         if(t=='#'){// #  stand for null
     45             return NULL;
     46         }
     47         else{
     48             BinTreeNode *r = new BinTreeNode;
     49             r->data = t;
     50             r->left = creat();
     51             r->right = creat();
     52             return r;
     53         }
     54     }
     55 };
     56 void preOrderTra(BinTreeNode *t){ //先跟便利
     57         if(t){
     58             cout<<t->data<<" ";
     59             preOrderTra(t->left);
     60             preOrderTra(t->right);
     61         }
     62 }
     63 void midOrderTra(BinTreeNode *t){  //中跟遍历
     64     if(t){
     65         midOrderTra(t->left);
     66         cout<<t->data<<" ";
     67         midOrderTra(t->right);
     68     }
     69 }
     70 void bacOrderTra(BinTreeNode *t){  //后跟遍历
     71     if(t){
     72         bacOrderTra(t->left);
     73         bacOrderTra(t->right);
     74         cout<<t->data<<" ";
     75     }
     76 }
     77 BinTreeNode * findFather(BinTreeNode *t, const char &p){
     78     //在t为跟的树中查找节点data p的父节点
     79     BinTreeNode *q;
     80     if(t== NULL) {
     81         return NULL; //根为空
     82     }
     83     if(t->data==p) {
     84         //cout<<"根节点就是"<<endl;
     85         return t;
     86     }
     87     if(t->left==NULL||t->right==NULL){
     88         //cout<<"叶节点"<<endl;
     89         return NULL;
     90     }
     91     if(t->left->data == p||t->right->data == p){
     92         //cout<<"找到了,返回"<<endl;
     93         return t;// find it
     94     }
     95     if((q= findFather((t->left),p))!=NULL){
     96         //cout<<"继续在左节点寻找"<<endl;
     97         return q;   //在t的左子树继续递归寻找
     98     }
     99     else {
    100         //cout<<"继续在右节点寻找"<<endl;
    101         return findFather(t->right,p);  //否则在右子树寻找
    102     }
    103 }
    104 BinTreeNode * find(BinTreeNode * q,const char &c){
    105     BinTreeNode *p=NULL;
    106     cout<<"find"<<endl;
    107     if(q==NULL){
    108         cout<<"root is null"<<endl;
    109         return NULL;
    110     }
    111     if(q->data==c){   //要先判断值,再判断左右儿子是否为空!!!!!!!!!
    112         cout<<"find it"<<endl;
    113         return q; //find it
    114     }
    115 
    116     if(q->left==NULL){
    117         cout<<"left is null"<<endl;
    118         return NULL;
    119     }
    120     if(q->right==NULL){
    121         cout<<"right is null"<<endl;
    122         return NULL;
    123     }
    124 
    125     if((p=find(q->left,c))!=NULL){
    126         cout<<"find left"<<endl;
    127         return p;
    128     }
    129     else{
    130         cout<<"find right"<<endl;
    131         return find(q->right,c);
    132     }
    133 }
    134 
    135 void delTree(BinTreeNode *r ,const char &c){
    136     BinTreeNode *temp;
    137     temp = findFather(r,c);
    138     if(temp==NULL){
    139         cout<<"not find char c!!!"<<endl;
    140         return ;
    141     }
    142     if(temp->left->data==c){
    143         temp->left=NULL;
    144     }
    145     if(temp->right->data==c){
    146         temp->right=NULL;
    147     }
    148     cout<<"deleted!"<<endl;
    149     return ;
    150 }
    151 
    152 int main() {
    153     BinTree mb;
    154     BinTreeNode *r;
    155     cout<<"输入要创建的树,空节点用#代替\n";
    156     r = mb.creat();
    157     cout<<"先跟遍历"<<endl;
    158     preOrderTra(r);
    159     cout<<"\n中跟遍历"<<endl;
    160     midOrderTra(r);
    161     cout<<"\n后跟遍历"<<endl;
    162     bacOrderTra(r);
    163     cout<<"find"<<endl;
    164     cout<<"A的父节点值为:"<<findFather(r,'A')->data<<endl;
    165     cout<<"B的父节点值为:"<<findFather(r,'B')->data<<endl;
    166     cout<<"C的父节点值为:"<<findFather(r,'C')->data<<endl;
    167     cout<<"D的父节点值为:"<<findFather(r,'D')->data<<endl;
    168     cout<<"E的父节点值为:"<<findFather(r,'E')->data<<endl;
    169     cout<<"F的父节点值为:"<<findFather(r,'F')->data<<endl;
    170     cout<<"-的父节点值为:"<<findFather(r,'-')->data<<endl;
    171     BinTreeNode *temp;
    172     temp = find(r,'A');
    173     cout<<"find A:"<<temp->data;
    174 
    175     delTree(r,'-');
    176     cout<<"bianli:"<<endl;
    177     preOrderTra(r);
    178 
    179 
    180     return 0;
    181 }

    测试数据:

     *+A##B##+*-C##D##E##F##

    运行结果:eclipse下的

    转载文章请注明出处: http://www.cnblogs.com/menglei/
  • 相关阅读:
    tensorflow 2.0 学习 (十) 拟合与过拟合问题
    tensorflow 2.0 学习 (九) tensorboard可视化功能认识
    tensorflow 2.0 学习 (八) keras模块的认识
    tensorflow 2.0 学习 (七) 反向传播代码逐步实现
    tensorflow 2.0 学习 (六) Himmelblua函数求极值
    tensorflow 2.0 学习 (五)MPG全连接网络训练与测试
    arp协议简单介绍
    Pthread spinlock自旋锁
    线程和进程状态
    内核态(内核空间)和用户态(用户空间)的区别和联系·
  • 原文地址:https://www.cnblogs.com/menglei/p/2772971.html
Copyright © 2011-2022 走看看