排序二叉树C++

为了构建一个排序二叉树。

依次输入一个序列,小的往左子树走,大的往右子树走。

输入:

数组长度n

n个待插入数字

输出:

第一行:中序遍历

第二行:中序遍历对应层数

第三行:中序遍历对应节点度数

#include<iostream>

using namespace std;

class node{

   public:

   node(int d):left(NULL),right(NULL),data(d),level(1),deg(0){}     //!!!注意初始化顺序与声明顺序相同

   node* left;    //左子节点

   node* right;   //右子节点

   int data,level,deg;  //数据、深度、度数,因为要边构建排序二叉树边计算节点的深度和度数
};


//用递归构建排序二叉树

void SortBiTreeJy(int n,node* root){      //传入剩余节点数、根节点指针

   //注意!!!!递归结束条件!!!
   if(n==0) return;

   //要构建二叉树,先要从根节点开始找到他们的父母,所以需要一个游历指针,用while循环找,所以还需要一个保留指针
   node* r=root;  //游历指针

   node* temp=r;  //保留指针

   //度数在最后创建节点的时候才改变,层数在找父母的时候就要改变
   int l=1;

   int a;     //输入
   cin>>a;

   //找父母
   while(r!=NULL){
        if(a<r->data){ //小,往左走
            temp=r;
            r=r->left;
            l++;
        }
        else{         //大,往右走
            temp=r;
            r=r->right;
            l++;
        }
   }
   //此时temp指向他的父母
   if(a<temp->data){   //小,左走,且父母度数++
      temp->left=new node(a);
      temp->deg++;
      temp->left->level=l;      //记录深度
   }
   else{
      temp->right=new node(a);
      temp->deg++;
      temp->right->level=l;     //记录深度
   }

   SortBiTreeJy(n-1,root);     //节点数少一,传入根节点,进入递归

}

void MidOrderDataJy(node* root){     //中序遍历,递归输出
     if(root==NULL) return;  //注意递归结束条件!!!
     
     MidOrderDataJy(root->left);
     cout<<root->data<<' ';
     MidOrderDataJy(root->right);
 
}

void MidOrderLevelJy(node* root){     //中序遍历,递归输出
     if(root==NULL) return;  //注意递归结束条件!!!
     
     MidOrderLevelJy(root->left);
     cout<<root->level<<' ';
     MidOrderLevelJy(root->right);
 
}

void MidOrderDegJy(node* root){     //中序遍历,递归输出
     if(root==NULL) return;  //注意递归结束条件!!!
     
     MidOrderDegJy(root->left);
     cout<<root->deg<<' ';
     MidOrderDegJy(root->right);
 
}

int main(){

    int n;
    cin>>n;
    
    int a;
    cin>>a;
    node* root=new node(a);
    
    SortBiTreeJy(n-1,root);   //-1因为已经创建根节点
    MidOrderDataJy(root);
    cout<<endl;
    MidOrderLevelJy(root);
    cout<<endl;
    MidOrderDegJy(root);

}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值