给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。使用C++写这段代码
时间: 2024-03-13 20:46:34 浏览: 58
这里提供一种利用二叉搜索树的性质,判断两个插入序列是否能生成一样的二叉搜索树的方法。具体来说,我们可以利用中序遍历得到二叉搜索树中元素的有序序列,然后比较两个序列是否相同。下面是使用C++实现的代码:
```cpp
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
void Insert(TreeNode* &root, int val) {
if (root == nullptr) {
root = new TreeNode(val);
} else if (val < root->val) {
Insert(root->left, val);
} else {
Insert(root->right, val);
}
}
void InorderTraversal(TreeNode* root, vector<int>& inorder) {
stack<TreeNode*> stk;
while (root || !stk.empty()) {
if (root) {
stk.push(root);
root = root->left;
} else {
root = stk.top();
stk.pop();
inorder.push_back(root->val);
root = root->right;
}
}
}
bool SameBST(vector<int>& seq1, vector<int>& seq2) {
if (seq1.size() != seq2.size()) {
return false;
}
TreeNode* root = nullptr;
for (int val : seq1) {
Insert(root, val);
}
vector<int> inorder;
InorderTraversal(root, inorder);
for (int i = 0; i < seq2.size(); ++i) {
if (seq2[i] != inorder[i]) {
return false;
}
}
return true;
}
int main() {
vector<int> seq1 = { 2, 1, 3 };
vector<int> seq2 = { 2, 3, 1 };
if (SameBST(seq1, seq2)) {
cout << "The two sequences can generate the same BST." << endl;
} else {
cout << "The two sequences cannot generate the same BST." << endl;
}
return 0;
}
```
在这个例子中,我们定义了一个二叉树节点结构TreeNode,以及插入函数Insert和中序遍历函数InorderTraversal。SameBST函数接受两个插入序列seq1和seq2,首先根据seq1构建二叉搜索树,然后得到中序遍历序列inorder,并与seq2比较是否相同。最后根据比较结果输出相应信息。
阅读全文