7-4 是否同一棵二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。随后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
输入样例:
1 2 3 4 5 6 7 8 | 4 2 3 1 4 2 3 4 1 2 3 2 4 1 2 1 2 1 1 2 0 |
输出样例:
1 2 3 | 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; }
知识点:
判断两棵树是否相同的代码:
1 2 3 4 5 6 7 8 9 10 11 12 | 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)插入结点
写法一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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); } } } |
写法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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; } |
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现