7-2 是否完全二叉搜索树 (30分)

7-2 是否完全二叉搜索树 (30分)_第1张图片
分析:
本题关键是完全二叉搜索树的概念(或者说定义)
我第一次没弄清楚什么是完全二叉树的概念,以为只有一种情况左孩子为空,右孩子不空这样就不是完全二叉树了,并把它当成判断条件来写代码,结果导致测试点3,4,5没过7-2 是否完全二叉搜索树 (30分)_第2张图片
我一开始疑惑为什么一边完美,另一边完全,会是NO,两边明明都是完全啊,合起来为完全嘛?(n脸懵逼)
原来是这样:
7-2 是否完全二叉搜索树 (30分)_第3张图片7-2 是否完全二叉搜索树 (30分)_第4张图片

左图左子树为完美二叉树,右图为完全二叉树,但整棵树不是完全二叉树,因为8号结点,按完美二叉树(右图)的次序应该也是12号,但它是8号,相对位置不一样,所以他不是完全二叉树。

所以判断完全二叉树的思路

首先每个二叉树都会有以下4种情况:

情况一:
7-2 是否完全二叉搜索树 (30分)_第5张图片

情况二:
7-2 是否完全二叉搜索树 (30分)_第6张图片

情况三:
7-2 是否完全二叉搜索树 (30分)_第7张图片

情况四:
7-2 是否完全二叉搜索树 (30分)_第8张图片

1:如果当前访问的节点的左右孩子是情况3,说明不是完全二叉树,直接返回false。

2:如果当前访问的节点的左右孩子是情况1,继续访问其他节点。

3:如果当前访问的节点的左右孩子是情况2或者情况4,那么就做一个判断(接下来访问的所有节点必须全部是叶子节点)。
具体代码看下面程序中的Pan(BinTree BST)函数。

#include
#include
typedef struct TNode* BinTree;
struct TNode{
    int Data;
    BinTree Left;
    BinTree Right;
};
BinTree Insert( BinTree BST, int x )
{
    if(!BST){
        BST=(BinTree)malloc(sizeof(struct TNode));
        BST->Data=x;
        BST->Left=BST->Right=NULL;
    }
    else{
        if(x>BST->Data) BST->Left=Insert( BST->Left, x );
        else if(x<BST->Data) BST->Right=Insert( BST->Right, x );
    }
    return BST;
}
void Out(BinTree BST)
{
    int i,front=0,tail=0,p=0;
    BinTree a[30],x;
    a[++tail]=BST;
    while(tail!=front){
        x=a[++front];
        if(p==0) {
            printf("%d",x->Data);
            p=1;
        }
        else printf(" %d",x->Data);
        if(x->Left) a[++tail]=x->Left;
        if(x->Right) a[++tail]=x->Right;
    }
}
void Pan(BinTree BST)
{
    int i,front=0,tail=0,q=0;
    BinTree a[30],x;
    a[++tail]=BST;
    while(tail!=front){
        x=a[++front];
        if(!x->Left&&x->Right){
        	printf("\nNO");
        	return;
		}
        if(x->Left&&x->Right){
			a[++tail]=x->Left;
			a[++tail]=x->Right;
		}
        if(!x->Right&&x->Left){
			a[++tail]=x->Left;
			q=1;
		}
		if(!x->Right&&!x->Left) q=1;
		while(q==1&&tail!=front){
			x=a[++front];
			if(x->Left||x->Right){
				printf("\nNO");
        		return;
			}
		}
    }
    printf("\nYES");
}
int main()
{
    int n,i,x;
    BinTree BST=NULL;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&x);
        BST=Insert(BST, x);
    }
    Out(BST);
    Pan(BST);
    return 0;
}

你可能感兴趣的:(笔记)