二叉排序数树
2016-03-02 17:48
323 查看
继续刷题,又拾起来一个知识点,二叉排序树。
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
还有前序中序后序查找。
新建,插入,删除。
加油。把代码保存下。
#include <iostream>
#include <string.h>
using namespace std;
struct Node{
Node* left;
Node* right;
char data;
Node():left(NULL),right(NULL),data('*'){}
};
//insert
void insertSortTree(Node * root,char data){
Node * p = root;
Node * q = new Node;
q->data = data;
while(1){
if(p->data>data&&p->left) //遍历直到左子树为空
p=p->left;
else if(p->data<data&&p->right)
p=p->right;
else if(p->data>data){
p->left=q;
return ;
}
else if(p->data<data){
p->right=q;
return ;
}
}
}
//destroy
void destroySortTree(Node * root){
Node * p = root;
if(p->left!=NULL)
destroySortTree(p->left);
if(p->right!=NULL)
destroySortTree(p->right);
delete p;
}
//create
Node * createSortTree(char * datas,int n){
if(n<=0)
return NULL;
Node * root = new Node;
root->data=datas[0];
Node* p = root;
for(int i=1;i<n;i++)
insertSortTree(root,datas[i]);
return root;
}
//变量声明
char x1[11],x2[11];
int ct1=0,ct2=0;
//先序遍历
void pre_lst(Node * root,char* x,int* index){
if(root)
x[(*index)++]=root->data;
if(root->left)
pre_lst(root->left,x,index);
if(root->right)
pre_lst(root->right,x,index);
}
//比较先序
bool cmp(int n){
for(int i=0;i<n;i++)
if(x1[i]!=x2[i])
return false;
return true;
}
int main()
{
int T;
int n;
Node* root1=NULL;
Node* root2=NULL;
int index1,index2;
while(1){
cin>>T;
if(T==0)
break;
cin>>x1;
ct1=strlen(x1);
root1=createSortTree(x1,ct1);
index1=0;
pre_lst(root1,x1,&index1);
for(int i=0;i<T;i++){
cin>>x2;
ct2=strlen(x2);
root2=createSortTree(x2,ct2);
index2=0;
pre_lst(root2,x2,&index2);
if(cmp(ct1))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
destroySortTree(root2);
}
destroySortTree(root1);
}
return 0;
}
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
还有前序中序后序查找。
新建,插入,删除。
加油。把代码保存下。
#include <iostream>
#include <string.h>
using namespace std;
struct Node{
Node* left;
Node* right;
char data;
Node():left(NULL),right(NULL),data('*'){}
};
//insert
void insertSortTree(Node * root,char data){
Node * p = root;
Node * q = new Node;
q->data = data;
while(1){
if(p->data>data&&p->left) //遍历直到左子树为空
p=p->left;
else if(p->data<data&&p->right)
p=p->right;
else if(p->data>data){
p->left=q;
return ;
}
else if(p->data<data){
p->right=q;
return ;
}
}
}
//destroy
void destroySortTree(Node * root){
Node * p = root;
if(p->left!=NULL)
destroySortTree(p->left);
if(p->right!=NULL)
destroySortTree(p->right);
delete p;
}
//create
Node * createSortTree(char * datas,int n){
if(n<=0)
return NULL;
Node * root = new Node;
root->data=datas[0];
Node* p = root;
for(int i=1;i<n;i++)
insertSortTree(root,datas[i]);
return root;
}
//变量声明
char x1[11],x2[11];
int ct1=0,ct2=0;
//先序遍历
void pre_lst(Node * root,char* x,int* index){
if(root)
x[(*index)++]=root->data;
if(root->left)
pre_lst(root->left,x,index);
if(root->right)
pre_lst(root->right,x,index);
}
//比较先序
bool cmp(int n){
for(int i=0;i<n;i++)
if(x1[i]!=x2[i])
return false;
return true;
}
int main()
{
int T;
int n;
Node* root1=NULL;
Node* root2=NULL;
int index1,index2;
while(1){
cin>>T;
if(T==0)
break;
cin>>x1;
ct1=strlen(x1);
root1=createSortTree(x1,ct1);
index1=0;
pre_lst(root1,x1,&index1);
for(int i=0;i<T;i++){
cin>>x2;
ct2=strlen(x2);
root2=createSortTree(x2,ct2);
index2=0;
pre_lst(root2,x2,&index2);
if(cmp(ct1))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
destroySortTree(root2);
}
destroySortTree(root1);
}
return 0;
}
相关文章推荐
- 新闻发布系统
- Android插件化原理解析——概要
- CMD命令行方式更改Win7系统主题
- 鼠标选中不能复制
- JSPath基础用法
- 使用 Spring Data JPA 简化 JPA 开发
- [读书笔记之安卓开发艺术探索]View的事件体系前的知识准备
- Python模拟登陆
- JS检测当前设备是PC还是移动端
- C语言 简单的队列(数组队列)
- swift 语法-012-可空、可非
- 对App Store App进行重签名、解密
- Redis - redis-cli 参数
- HDU 4436(后缀自动机)
- 新建菜单
- Unity3D 调用 Android jar 包制作方法
- 递归_数制转换
- 【慕课笔记】第六章 JAVA中的集合框架(下) 第8节 实现学生序列排序
- css3模糊图片
- Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题