为了构建一个排序二叉树。
依次输入一个序列,小的往左子树走,大的往右子树走。
输入:
数组长度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);
}