7-52 二叉树查找结点及父结点 (5 分)

7-52 二叉树查找结点及父结点 (5 分)

编写程序在二叉树中查找给定结点及父结点。二叉树结点的数据域值不等于0的整数。

输入格式:

输入第1行为一组用空格间隔的整数,表示带空指针信息的二叉树先根序列,其中空指针用0表示。例如1 5 8 0 0 0 6 0 0表示如下图的二叉树。第2行为整数m,表示查询个数。接下来m行,每行为一个不等于0的整数K,表示要查找的结点的数据值。m不超过100,二叉树结点个数不超过150000,高度不超过6000。输入数据保证二叉树各结点数据值互不相等。

PA567.jpg

输出格式:

输出为m行,每行1个整数,表示被查找结点K的父结点数据值,若二叉树中无结点K或结点K无父结点,则输出0。

输入样例:

1 5 8 0 0 0 6 0 0
3
8
1
6

结尾无空行

输出样例:

5
0
1

结尾无空行

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct TNode* Position;
typedef Position BinTree;
struct TNode {
    int Data;
    BinTree Left;
    BinTree Right;
    BinTree Father;
};
int flag;
int k=0;
int arr[15000];
void CreatBinTree(BinTree *BT) {//对指针的修改需用指针的指针
    int val;
    scanf("%d", &val);
    if (val == 0)*BT = NULL;
    else {
        *BT = (BinTree)malloc(sizeof(TNode));
        (*BT)->Father = NULL;
        (*BT)->Data = val;
        (*BT)->Left = (*BT)->Right = NULL;
        CreatBinTree(&(*BT)->Left);
        CreatBinTree(&(*BT)->Right);
    }
}
void Create(BinTree BT) {//对数据的修改需用数据的指针
    if (BT->Left != NULL) {
        BT->Left->Father = BT;
        Create(BT->Left);
    }
    if (BT->Right != NULL) {
        BT->Right->Father = BT;
        Create(BT->Right);
    }
}
int PreorderTraversal(BinTree BT,int X) {
    int p;
    if (BT->Data == X) {
        flag = 1;
        if (BT->Father == NULL) {//最大的那棵树无父节点
            arr[k] = 0;
            k++;
        }
        else {
            p =BT->Father->Data;
            arr[k] = p;
            k++;
        }
        return flag;
    }
    if (BT->Left != NULL && flag == 0)
        PreorderTraversal(BT->Left, X);
    if (BT->Right != NULL && flag == 0)
        PreorderTraversal(BT->Right, X);
}
int main() {
    int m, i, x;
    BinTree BT;
    BT = (BinTree)malloc(sizeof(TNode));
    CreatBinTree(&BT);
    Create(BT);
    scanf("%d", &m);
    if (m < 100) {
        for (i = 0; i < m; i++) {
            flag = 0;
            scanf("%d", &x);
            PreorderTraversal(BT,x);
            if (flag == 0) {//没找到x的情况
                arr[k] = 0;
                k++;
            }
        }
    }
    for (i = 0; i < k; i++) {
        printf("%d\n", arr[i]);
    }
    system("pause");
    return 0;
}

### 回答1: 题目描述:在二叉树查找给定结点及父结点二叉树结点的数据域不等于0的整数。 需要在二叉树查找给定结点以及其父节点,题目给出了二叉树结点数据域不等于0的整数,因此在遍历二叉树时,对于每个结点都需要判断该结点的左右子树是否存在目标结点,如果存在则输出该结点及其父结点即可。 可能的代码实现: ``` class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def find_node_and_parent(root, target): if not root: return None, None if root.left and root.left.val == target: return root, root.left if root.right and root.right.val == target: return root, root.right left_parent, left_node = find_node_and_parent(root.left, target) if left_node: return left_parent, left_node right_parent, right_node = find_node_and_parent(root.right, target) if right_node: return right_parent, right_node return None, None ``` 其中,TreeNode类表示二叉树结点,find_node_and_parent函数用于查找目标结点及其父结点。函数接受两个参数,root表示当前遍历到的结点,target表示目标结点的值。如果当前结点为空,说明没有找到目标结点,返回(None, None),否则依次判断当前结点的左右子树是否为目标结点,如果是则直接返回该结点及其父节点;否则递归调用左右子树,并将返回结果作为当前函数的返回结果。 例如,对于二叉树如下所示: 如果要查找结点5及其父节点,则调用find_node_and_parent(root, 5),输出(3, 5);如果要查找结点1及其父节点,则调用find_node_and_parent(root, 1),输出(None, None)。 ### 回答2: 要在二叉树查找给定结点及父结点,我们可以使用递归的方法进行实现。首先,我们需要定义一个二叉树结构体,其中包括一个数据域值和左右子树指针。然后,我们可以使用以下代码实现给定结点查找: ``` struct TreeNode { int val; TreeNode* left; TreeNode* right; }; //查找给定值为val的结点及其父结点 void findNode(TreeNode* root, int val, TreeNode* &node, TreeNode* &parent) { if (root == nullptr) { //如果根节点为空,返回空指针 node = nullptr; parent = nullptr; return; } if (root->val == val) { //如果根节点的值等于给定值,返回当前节点和父节点 node = root; parent = nullptr; return; } if (root->left != nullptr && root->left->val == val) { //如果左子树中有给定值,返回左子树的当前节点和父节点 node = root->left; parent = root; return; } if (root->right != nullptr && root->right->val == val) { //如果右子树中有给定值,返回右子树的当前节点和父节点 node = root->right; parent = root; return; } findNode(root->left, val, node, parent); //在左子树中继续查找 if (node == nullptr) { //如果左子树中没有找到,就在右子树中继续查找 findNode(root->right, val, node, parent); } else { //如果左子树中找到了,直接返回 return; } } ``` 在上述代码中,我们使用了引用传递的方式传递指针的指针,以便在函数内部改变指针的指向。函数的基本思路是先判断当前节点是否是给定节点,如果是,则返回当前节点和父节点。如果不是,则在左右子树中继续查找,如果在左子树中找到,则直接返回;如果在右子树中找到,则返回右子树的当前节点和父节点;如果在左右子树中都没有找到,则返回空指针。 要测试我们的函数是否正常工作,我们可以构建一棵二叉树,并调用上述函数进行测试。例如,我们可以构建如下的二叉树: ``` 1 / \ 2 3 / \ \ 4 5 6 / \ 7 8 ``` 这棵树的根节点是1,它有两个子节点别是2和3。2节点有两个子节点4和5,3节点有一个子节点6。5节点有两个子节点7和8。假设我们要查找值为7的节点及其父节点,我们可以调用findNode函数进行查找: ``` TreeNode* node; TreeNode* parent; findNode(root, 7, node, parent); if (node != nullptr) { cout << "node value: " << node->val << endl; } if (parent != nullptr) { cout << "parent value: " << parent->val << endl; } ``` 这里的root是根节点的指针。如果查找成功,将输出“node value: 7”和“parent value: 5”。 ### 回答3: 二叉树是一种在计算机科学中广泛使用的数据结构,它由一个根节点开始,每个节点都有一个最多两个子节点的左子树和右子树。在二叉树查找给定结点及父结点的程序需要以下基本思路: 首先,我们需要定义一个二叉树结构体,包含数据域值和左右子节点。结构体中还需要定义一个指向父节点的指针,因为需要找到给定结点的父节点。 其次,编写一个函数来实现在二叉树查找给定结点及父结点。函数需要在树中进行遍历,在每个节点处判断其数据域值是否等于给定结点的值。如果找到了给定结点,记录其父节点;如果遍历完整个树还没有找到,则说明该结点不存在于树中。 最后,运用该函数,输入给定结点的值,即可获得该结点及其父节点的信息。 通过以上步骤,就可以编写程序在二叉树查找给定结点及其父结点。此外,在实际应用中,还可以加入其他功能,例如向二叉树中插入和删除节点等。总之,二叉树是一种十实用的数据结构,在编写程序时应用得当,可以大大提高程序的效率,使得程序更加稳定可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值