题目描述
已知一棵二叉树用邻接表结构存储,中序查找二叉树中值为x的结点,并指出是第几个结点。例:如图二叉树的数据文件的数据格式如下
输入
第一行n为二叉树的结点个树,n<=100;第二行x表示要查找的结点的值;以下第一列数据是各结点的值,第二列数据是左儿子结点编号,第三列数据是右儿子结点编号。
输出
输出一个数即查找的结点编号。
样例输入 Copy
7 15 5 2 3 12 4 5 10 0 0 29 0 0 15 6 7 8 0 0 23 0 0
样例输出 Copy
4
感觉二叉树的题目是真的不好做啊,自己还是太菜了
#include<iostream>
#include<vector>
using namespace std;
struct node
{
int data;
int num;
node* left;
node* right;
};
void inorder(node* root, int value, int& pos, int& res)//因为是中序查找,所以这个pos的位置很关键
{
if (root == NULL)
{
return;
}
inorder(root->left, value, pos, res);
pos++;
if (root->data==value)
{
res = pos;
}
inorder(root->right, value, pos, res);
}
int main()
{
int n,k,data,l,r;
cin >> n;
cin >> k;
vector<int> left(n + 1, 0);
vector<int> right(n + 1, 0);
vector<node*> nodes(n + 1, 0);
for (int i = 1; i <= n; i++)
{
cin >> data >> l >> r;
nodes[i] = new node;
nodes[i]->data = data;
nodes[i]->num = i;
left[i] = l;
right[i] = r;
}
for (int i = 1; i <= n; i++)
{
nodes[i]->left = (left[i] == 0 ? NULL : nodes[left[i]]);
nodes[i]->right = (right[i] == 0 ? NULL : nodes[right[i]]);
}
int res = -1;
int pos = 0;
inorder(nodes[1], k, pos, res);
cout << res << endl;
return 0;
}