题目:https://cn.vjudge.net/problem/HDU-3791
题意:中文题干不再赘述
思路:根据输入建二叉搜索树,若前序和中序遍历的结果相同则必定是同一棵二叉树。
代码:C++
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <stack>
using namespace std;
struct Node
{
Node *left;
Node *right;
int val;
Node(int val = 0): val(val), left(NULL), right(NULL) {}
};
struct Tree
{
vector<int> inorder, preorder;
Node *root;
Tree(): root(NULL) {}
void build(string &s)
{
for(int i = 0; i < s.size(); i++)
{
insert(s[i] - '0');
}
dfs(root);
}
void insert(int v)
{
if(root == NULL)
{
root = new Node(v);
return;
}
Node *cur = root;
while(true)
{
if(v < cur->val)
{
if(cur->left == NULL)
{
cur->left = new Node(v);
break;
}
cur = cur->left;
}
else if(v > cur->val)
{
if(cur->right == NULL)
{
cur->right = new Node(v);
break;
}
cur = cur->right;
}
}
}
void dfs(Node *cur)
{
preorder.push_back(cur->val);
if(cur->left)
{
dfs(cur->left);
}
inorder.push_back(cur->val);
if(cur->right)
{
dfs(cur->right);
}
}
bool operator == (const Tree &t) const
{
return inorder == t.inorder && preorder == t.preorder;
}
void clear(Node *cur)
{
if(cur->left)
{
clear(cur->left);
}
if(cur->right)
{
clear(cur->right);
}
delete cur;
}
~Tree()
{
clear(root);
}
};
int main()
{
int n;
while(cin >> n && n)
{
string s;
cin >> s;
Tree ori;
ori.build(s);
for(int i = 0; i < n; i++)
{
cin >> s;
Tree t;
t.build(s);
printf("%s\n", ori == t ? "YES" : "NO");
}
}
return 0;
}
本文介绍了一种通过构建二叉搜索树并比较前序和中序遍历结果来判断两棵树是否相同的算法实现。使用C++编程语言,详细展示了如何构建树结构、插入节点以及进行深度优先搜索遍历。

497

被折叠的 条评论
为什么被折叠?



