この質問では、二分探索木の概念と性質を調べます
まず、
バイナリサーチツリーの概念とプロパティを最初に理解する必要があります。バイナリサーチツリー(バイナリサーチツリー)(また、バイナリサーチツリー、バイナリソートツリー)は、空のツリーであるか、次のプロパティを持っています。二分木:
左側のサブツリーが空でない場合、左側のサブツリーのすべてのノードの値はそのルートノードの値よりも小さく、
右側のサブツリーが空でない場合は、右側のサブツリーのすべてのノードの値値はそのルートノードの値よりも大きく、
その左側と右側のサブツリーもそれぞれバイナリソートツリーです。
バイナリ検索ツリーは、古典的なデータ構造として、リンクリストの高速な挿入および削除操作の特徴と、配列の高速検索の利点を備えているため、ファイルシステムやデータベースシステムなど、広く使用されています。データ構造は、効率的なソートおよび取得操作を実行します。
//创建二叉树
BinTree BuildTree()/* 由裁判实现,细节不表 */
{
int n;
BinTree p = (BinTree)malloc(sizeof(struct TNode));
if(p==NULL) return NULL;
scanf("%d",&n);
getchar();
if(n==-1) return NULL;//判断是否为叶结点
else
{
p->Data = n;
printf("请输入 %d 的左子结点: ",n );
p->Left=BuildTree();
printf("请输入 %d 的右子结点: ",n );
p->Right=BuildTree();
}
return p;
}
//AC代码
//由二叉搜索树的性质得出:按中序遍历二叉排序树所得到中序序列是一个递增有序序列
//思路:获取中序遍历序列,再判断该序列是否递增有序,就能得出此二叉树是否为二叉搜索树
bool IsBST ( BinTree T )
{
BinTree *b[100];
int a[100];
int i=0;
int j;
int count=0;
BinTree p=T;
int top = -1;
if(T==NULL) return true; /*空树也是二叉排序(搜索)树*/
while(p!=NULL||top!=-1) /*非递归(栈+循环)中序遍历*/
{
if(p!=NULL)
{
b[++top] = p;
p = p->Left;
}
else
{
p = b[top--];
a[i++] = p->Data;
p = p->Right;
}
}
for(j = 0 ; j<i ; ++j) /*判断该数组是否是递增的有序系列*/
{
if(a[j]<=a[j+1]&&j+1<i) count++;
}
if(count==i-1) return true;
else return false;
}
今日、私はブログに行き、素晴らしい神のコードを見て、よく書かれていて、リンクを付けました:
それは二分探索木ですか?