演習4.3は二分探索木です(25ポイント)

この質問では、二分探索木の概念と性質を調べます

まず、
      バイナリサーチツリーの概念とプロパティを最初に理解する必要があります。バイナリサーチツリー(バイナリサーチツリー)(また、バイナリサーチツリー、バイナリソートツリー)は、空のツリーであるか、次のプロパティを持っています。二分木:
      左側のサブツリーが空でない場合、左側のサブツリーのすべてのノードの値はそのルートノードの値よりも小さく、
      右側のサブツリーが空でない場合は、右側のサブツリーすべてのノードの値値はそのルートノードの値よりも大きく、
      その左側と右側のサブツリーもそれぞれバイナリソートツリーです。

       バイナリ検索ツリーは、古典的なデータ構造として、リンクリストの高速な挿入および削除操作の特徴と、配列の高速検索の利点を備えているため、ファイルシステムやデータベースシステムなど、広く使用されています。データ構造は、効率的なソートおよび取得操作を実行します。

//创建二叉树
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;
} 

今日、私はブログに行き、素晴らしい神のコードを見て、よく書かれていて、リンクを付けました:
それは二分探索木ですか?

おすすめ

転載: blog.csdn.net/m0_46267375/article/details/105341116