7-4 是否同一棵二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。随后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
输入样例:
4 2 3 1 4 2 3 4 1 2 3 2 4 1 2 1 2 1 1 2 0
输出样例:
Yes No No
代码:
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <set> typedef struct Node* Tree; struct Node{ int data; Tree left; Tree right; }; void insert(Tree &tree,int x){ if(tree==NULL){ tree = (Tree)malloc(sizeof(struct Node)); tree->data=x; tree->left=NULL; tree->right=NULL; } else{ if(x<tree->data){ insert(tree->left,x); } else if(x>tree->data){ insert(tree->right,x); } } } bool isSame(Tree tree1,Tree tree2){ if(tree1==NULL && tree2==NULL){ return true; } if(tree1==NULL || tree2==NULL){ return false; } if(tree1->data!=tree2->data){ return false; } return isSame(tree1->left,tree2->left)&&isSame(tree1->right,tree2->right); } using namespace std; int main() { int n=1,l; int a[15]; while(n!=0){ scanf("%d",&n); if(n==0){ break; } scanf("%d",&l); Tree root1 = NULL; for(int i=0;i<n;i++){ scanf("%d",&a[i]); insert(root1,a[i]); } for(int i=0;i<l;i++){ int b[15]; Tree root2=NULL; for(int j=0;j<n;j++){ scanf("%d",&b[j]); insert(root2,b[j]); } // cout<<root1->data<<root2->data<<endl; if(!isSame(root1,root2)){ printf("No\n"); }else{ printf("Yes\n"); } } } return 0; }
知识点:
判断两棵树是否相同的代码:
bool isSame(Tree tree1,Tree tree2){
    if(tree1==NULL && tree2==NULL){
        return true;
    }
    if(tree1==NULL || tree2==NULL){
        return false;
    }
    if(tree1->data!=tree2->data){
        return false;
    }
    return isSame(tree1->left,tree2->left)&&isSame(tree1->right,tree2->right);
}
二叉搜索树(BST)插入结点
写法一:
void insert(Tree &tree,int x){
    if(tree==NULL){
        tree = (Tree)malloc(sizeof(struct Node));
        tree->data=x;
        tree->left=NULL;
        tree->right=NULL;
    }
    else{
        if(x<tree->data){
            insert(tree->left,x);
        }
        else if(x>tree->data){
            insert(tree->right,x);
        }
    }
}
写法二:
BinTree Insert( BinTree BST, ElementType X ){
    if(BST==NULL){
        BST=(Position)malloc(sizeof(struct TNode));
        BST->Data=X;
        BST->Left=NULL;
        BST->Right=NULL;
    }
    else{
        if(BST->Data==X){
            
        }
        else if(BST->Data>X){
            BST->Left=Insert(BST->Left, X);
        }
        else {
            BST->Right=Insert(BST->Right, X);
        }
    }
    
    return BST;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号