📜  在给定的二叉树中找到节点的父节点(1)

📅  最后修改于: 2023-12-03 15:08:05.329000             🧑  作者: Mango

在给定的二叉树中找到节点的父节点

二叉树是一种重要的数据结构,在二叉树中,每个节点最多有两个子节点,一个是左子节点,另一个是右子节点。在二叉树中,节点的父节点就是指向这个节点的指针所指向的节点。如果我们已知一个二叉树的某个节点,如何找到它的父节点呢?

方法一:记录父节点

一个常用的解决方案是,在构建二叉树的时候,为每个节点记录其父节点。这样,当我们已知一个节点时,就可以通过其父节点指针来找到其父节点。

例如,我们可以定义一个结构体表示二叉树的节点:

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode *parent; // 父节点指针
};

在构建二叉树时,我们可以按照一定的规则来设置节点的父节点指针:

TreeNode* buildTree() {
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->left->parent = root;
    root->right = new TreeNode(3);
    root->right->parent = root;
    root->left->left = new TreeNode(4);
    root->left->left->parent = root->left;
    // ...
    return root;
}

现在,假设我们已知一个节点 node,如果要找到它的父节点,只需要访问它的 node->parent 指针即可。

方法二:遍历二叉树

另一种解决方案是,遍历整个二叉树,找到该节点所在的位置,然后返回其父节点。

我们可以写一个递归函数 findParent 来实现这个功能:

TreeNode* findParent(TreeNode* root, TreeNode* node) {
    if (!root) return nullptr;
    if (root->left == node || root->right == node) return root;
    TreeNode* left = findParent(root->left, node);
    if (left) return left;
    return findParent(root->right, node);
}

这个函数的基本思路是,如果当前节点的左子节点或右子节点等于给定的节点,则当前节点就是这个节点的父节点;否则,继续在左子树和右子树中查找。如果左子树中找到了该节点,则返回左子树的结果;否则,继续在右子树中查找。如果右子树中也没有找到,则说明该节点不存在于这个二叉树中,函数返回 nullptr

总结

无论是记录父节点还是遍历二叉树,都是一种有效的方法来找到给定节点的父节点。在实际应用中,我们可以根据具体情况选择合适的方法来实现。无论哪种方法,都需要对二叉树的结构和算法有一定的理解和掌握,才能在实际应用中取得良好的效果。