判断两序列是否为同一二叉搜索树序列
输入描述:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
二叉搜索树建树
\color{blue}\textbf{二叉搜索树建树}
二叉搜索树建树
给定一个序列,二叉搜索树的建树过程如下:
依次读入节点,根据节点大小决定他的走向是左子树还是右子树,如果走到了一个空节点,那么就在这个节点插入该值。
node * insert(ll val, node * root) {
if (root == NULL){
root = new node(val); return root;
}
if (val < root->val) { root->lc = insert(val, root->lc); return root; }
else { root->rc = insert(val, root->rc); return root; }
}
二叉搜索树性质
\color{blue}\textbf{二叉搜索树性质}
二叉搜索树性质
二叉搜索树的中序遍历是树上所有元素的升序排列,也就是说所含数字一样的二叉搜索树即使结构不同,他的中序遍历总是相同的,因此判断二叉搜索树结构是否相同我们需要用前序或者后序遍历。
//前序遍历
void preOrder(node * root, string & step) {
if (root == NULL)return;
step += root->val + '0';
preOrder(root->lc, step);
preOrder(root->rc, step);
}
判断两个序列能否构成同一个二叉搜索树 \color{blue}\textbf{判断两个序列能否构成同一个二叉搜索树} 判断两个序列能否构成同一个二叉搜索树
struct node {
ll val;
node *lc, *rc;
node(ll v = 0) { val = v, lc = NULL, rc = NULL; }
};
node * insert(ll val, node * root) {
if (root == NULL){
root = new node(val); return root;
}
if (val < root->val) { root->lc = insert(val, root->lc); return root; }
else { root->rc = insert(val, root->rc); return root; }
}
void preOrder(node * root, string & step) {
if (root == NULL)return;
step += root->val + '0';
preOrder(root->lc, step);
preOrder(root->rc, step);
}
int main() {
ll n;
while (cin >> n) {
string s, s1, step;
cin >> s;
node *root = new node(s[0] - '0');
for (int i = 1; i < s.size(); i++) insert(s[i] - '0', root);
preOrder(root, step);
for (int i = 0; i < n; i++) {
cin >> s1; string sstep;
node * rroot = new node(s1[0] - '0');
for (int i = 1; i < s1.size(); i++) insert(s1[i] - '0', rroot);
preOrder(rroot, sstep);
if (sstep == step)cout << "YES" << endl;
else cout << "NO" << endl;
}
}
}