题目描述
输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
输入描述:
输入第一行包括一个整数n(1<=n<=100)。
接下来的一行包括n个整数。
输出描述:
可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。
每种遍历结果输出一行。每行最后一个数据之后有一个空格。
示例1
输入
5
1 6 5 9 8
输出
1 6 5 9 8
1 5 6 8 9
5 8 9 6 1
解题思路
分为两步:1.建立排序二叉树,这里不需要是平衡的,直接插入就好了,用递归很好写;2.遍历二叉树,二叉树先序中序后序遍历的递归版本估计上过数据结构的应该都会写吧。附上代码,哪里不懂或有错误评论留言,谢谢大家。
ps:这个题我在牛客上刷时碰到个问题,如果不用循环输入的话代码一直无法通过测试样例,不知道怎么回事,以后我刷算法题估计会都用个死循环输入了。
#include<iostream>
using namespace std;
class treeNode{
public:
int data;
treeNode* left;
treeNode* right;
treeNode(int d){
data=d;
left=NULL;
right=NULL;
}
};
void insert(int data,treeNode* head){
if(data>head->data){
if(head->right==NULL){
treeNode* node=new treeNode(data);
head->right=node;
}else{
insert(data,head->right);
}
}else if(data<head->data){
if(head->left==NULL){
treeNode* node=new treeNode(data);
head->left=node;
}else{
insert(data,head->left);
}
}
}
void preorderTraversal(treeNode* head){ //先序遍历
if(head==NULL)return;
cout<<head->data<<" ";
preorderTraversal(head->left);
preorderTraversal(head->right);
}
void inorderTraversal(treeNode* head){ //中序遍历
if(head==NULL)return;
inorderTraversal(head->left);
cout<<head->data<<" ";
inorderTraversal(head->right);
}
void postorderTraversal(treeNode* head){ //后续遍历
if(head==NULL)return;
postorderTraversal(head->left);
postorderTraversal(head->right);
cout<<head->data<<" ";
}
int main(){
int n;
treeNode* head;
while(cin>>n){ //循环输入
n--;
int val;
cin>>val;
head=new treeNode(val);
while(n--){
cin>>val;
insert(val,head);
}
preorderTraversal(head);cout<<endl;
inorderTraversal(head);cout<<endl;
postorderTraversal(head);cout<<endl;
}
return 0;
}