我们得到了一个有序线程的二叉树。这意味着,如果一个节点没有左子节点(右子节点),左线程(右线程)将从该节点链接到其索引前一个节点(索引后一个节点)。
你能帮我找到一个节点的父节点的伪代码或算法吗?例如(见下图),给定的节点是Q,父节点必须是I。(我们应该利用给定的想法,即二进制是有序线程)
TMI:我实际上需要这个伪代码/算法来创建另一个算法,它将获得二叉树的后序继承者。
从图中可以看出:
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个父节点的子节点,并且所有组中的所有父节点与每个其他父节点都有一个子节点。现在我想要回父母都在第一组的孩子。 我尝试的示例查询是