跳转至

一本通-1367:查找二叉树(tree_a)

【题目描述】 已知一棵二叉树用邻接表结构存储,中序查找二叉树中值为x的结点,并指出是第几个结点。例:如图二叉树的数据文件的数据格式如下:

img

【输入】 第一行n为二叉树的结点个树,n≤100;第二行x表示要查找的结点的值;以下第一列数据是各结点的值,第二列数据是左儿子结点编号,第三列数据是右儿子结点编号。

【输出】 一个数即查找的结点编号。

【输入样例】 7 15 5 2 3 12 4 5 10 0 0 29 0 0 15 6 7 8 0 0 23 0 0

【输出样例】 4


最开始的思路是建树,然后辅助栈中序遍历即可,虽然并不需要建树,但是还是练习一下。

#include <bits/stdc++.h>

using namespace std;

struct Node
{
    int val;
    int leftNode, rightNode;
};

struct TreeNode
{
    int val;
    TreeNode *left, *right;
    TreeNode(int x): val(x), left(NULL), right(NULL) {}
};

vector<Node> seq(105);
int n;
int target, step = 0;

TreeNode *build(int pos)
{
    if (!pos) return NULL;

    TreeNode *root = new TreeNode(seq[pos].val);
    root -> left = build(seq[pos].leftNode);
    root -> right = build(seq[pos].rightNode);

    return root;
}

void inorderTraversal(TreeNode *root)
{
    if (!root) return;
    stack<TreeNode*> s;
    TreeNode *p = root;

    while (!s.empty() || p) {
        if (p) {
            s.push(p);
            p = p -> left;
        }
        else {
            p = s.top(); s.pop();
            ++step;
            if (p -> val == target) return;
            p = p -> right;
        }
    }
}

void makeEmpty(TreeNode *& root)
{
    if (root) {
        makeEmpty(root -> left);
        makeEmpty(root -> right);
        delete root;
        root = NULL;
    }
}

int solve()
{
    TreeNode *root = build(1);
    inorderTraversal(root);
    makeEmpty(root);

    return step;
}


int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> target;
    for (int i = 1; i <= n; ++i) {
        cin >> seq[i].val >> seq[i].leftNode >> seq[i].rightNode;
    }
    cout << solve() << endl;

    return 0;
}

也可以不用建树,因为每个节点已经给出了左右节点的编号,就相当于建树了。

#include <bits/stdc++.h>

using namespace std;

struct Node
{
    int val;
    int leftNode, rightNode;
};

vector<Node> seq(105);
int n;
int target, step = 0;

void inorderTraversal(int pos)
{
    if (seq[pos].leftNode) inorderTraversal(seq[pos].leftNode);

    ++step;
    if (seq[pos].val == target) {
        cout << step << endl;
        exit(0);
    }

    if (seq[pos].rightNode) inorderTraversal(seq[pos].rightNode);
}


int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> target;
    for (int i = 1; i <= n; ++i) {
        cin >> seq[i].val >> seq[i].leftNode >> seq[i].rightNode;
    }
    inorderTraversal(1);

    return 0;
}