当前位置: 首页 > 知识库问答 >
问题:

给定一个有序线程二叉树和一个节点,如何找到该特定节点的父节点?

海信鸥
2023-03-14

我们得到了一个有序线程的二叉树。这意味着,如果一个节点没有左子节点(右子节点),左线程(右线程)将从该节点链接到其索引前一个节点(索引后一个节点)。

你能帮我找到一个节点的父节点的伪代码或算法吗?例如(见下图),给定的节点是Q,父节点必须是I。(我们应该利用给定的想法,即二进制是有序线程)

TMI:我实际上需要这个伪代码/算法来创建另一个算法,它将获得二叉树的后序继承者。

共有1个答案

子车修平
2023-03-14

从图中可以看出:

  • head节点是一个特殊的哨兵节点,仅用作连接实际树的哨兵节点(可能是空的)

然后,查找给定节点的父节点的逻辑可以如下所示:

  • 在给定节点的子树中找到最右边的节点

下面是这个想法在JavaScript中的实现。此代码段定义了一个节点类。它创建了示例中给出的树。节点类有一个顺序迭代器,我们使用该迭代器访问每个节点,然后使用上述算法显示其父节点:

class Node {
    constructor(value=null, left=null, right=null) {
        this.value = value;
        this.hasLeft = false;
        this.hasRight = false;
        this.left = left || this; // Default is self-reference
        this.right = right || this; // Default is self-reference
    }
    insertLeft(value) {
        this.hasLeft = true;
        this.left = new Node(value, this.left, this);
        return this.left;
    }
    insertRight(value) {
        this.hasRight = true;
        this.right = new Node(value, this, this.right);
        return this.right;
    }
    parent() {
        // Find rightmost node of subtree
        let node = this;
        while (node.hasRight) {
            node = node.right;
        }
        node = node.right; // go to ancestor
        // The this-node is in the left subtree of node.
        if (node.left === this) return node;
        node = node.left;
        while (node.right !== this) {
            node = node.right;
        }
        return node;
    }
    * inorder() {
        if (this.hasLeft) yield * this.left.inorder();
        if (this.right !== this) yield this; // When it is not the head
        if (this.hasRight) yield * this.right.inorder();
    }
}

// Create the example tree:
let head = new Node(); // Sentinel node (without data)
head.insertLeft("C").insertLeft("I").insertLeft("Q").insertRight("U").right.right
                    .insertRight("S").insertLeft("K").right
                                     .insertRight("R").insertLeft("O").right
                                                      .insertRight("T");

// Visit each node, display its value and that of its parent:
for (let node of head.inorder()) {
    console.log("parent of " + node.value + " is " + node.parent().value);
}
 类似资料:
  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • 给定单链表的最后一个节点,我们如何找到头节点? 假设给定JSON: {“id”:“A”,“next”:“B”},{“id”:“B”,“next”:“C”}{“id”:“C”,“next”:“D”}{“id”:“D”,“next”:“null} 现在假设上面没有排序,我们需要算出HEAD元素“A”。

  • 所以,我想做的是检查一个完整的二叉树叶子中的 int 是否比它的父叶大,并以此为标准让它与它的父叶不断改变位置,一直到根。问题是,当它必须与根进行比较和更改位置时,它会塞格福;如果我在那之前让循环停止,它工作得很好(我认为)。我在这里错过了一些明显的东西吗? 添加新叶子时,将发生以下情况。我省略了叶子实际添加到树中的部分,因为它工作正常并且很长。指针 p 指向循环开始之前插入的最后一个叶。根的父亲

  • 我正在研究合并两个二叉树的问题(https://www.geeksforgeeks.org/merge-two-binary-trees-node-sum/)我很难理解一些递归。为什么要将递归语句设置为和?当你这样做的时候,是否等于两个值? 我只是不确定为什么我们要将递归语句设置为t1.leftt1.right'

  • 我遇到了这个问题,似乎在任何地方都找不到解决办法。 给定一个二叉树,其中每个节点都包含一个数字,表示其子树中剩余节点的数量,编写一个函数,返回第n个按顺序遍历的节点。 查找按序遍历的第n个节点相当简单,但如何使用关于左节点数的信息来改进该过程?

  • 我试图想出一个密码查询,可以返回某些父母的孩子节点,其中孩子的父母都是期望的父母。 我在这个控制台上有一个示例数据集:http://console.neo4j.org/?id=nsq8c1 在该示例中,我们有包含父节点的组节点,以及正好有2个父节点的子节点,并且所有组中的所有父节点与每个其他父节点都有一个子节点。现在我想要回父母都在第一组的孩子。 我尝试的示例查询是