如果二进制搜索树中的节点有指向其父节点的指针,是否可以在不需要递归或额外数据结构的情况下进行按顺序遍历?
这里有一个小例子。
Map<TreeNode,TreeNode> parent; // available
Set<TreeNode> set = new HashSet<>(); // maintain visited nodes
TreeNode curr = root;
while(curr!=null){
if(!set.contains(curr.left) && curr.left!=null){
curr = curr.left;
}else if(!set.contains(curr.right) && curr.right!=null){
System.out.print(curr.value+" ");
curr = curr.right;
}else{
if(curr.right==null){
System.out.print(curr.value+" ");
}
set.add(curr); // mark it as completely visited
curr = parent.get(curr);
}
}
要获得第一个节点,您只需从根开始,尽可能向左。
从任何节点到达下一个节点:
当你从根部向上爬的时候,你就完成了。
在遍历过程中跟踪上一个节点,这将有助于决定下一步要走哪条路。
在C#中:
class Node {
/* ... */
public void inorder() {
Node curr = this;
Node prev = null;
Node next = null;
while (curr != null) {
if (curr.right != null && prev == curr.right) {
next = curr.parent;
} else if (curr.left == null || prev == curr.left) {
Console.WriteLine(curr.data); // <-- visit the node.
next = curr.right != null ? curr.right : curr.parent;
} else {
next = curr.left;
}
prev = curr;
curr = next;
}
}
};
在C中,它可以看起来像这样:
void inorder(Node* root) {
Node * curr = root;
Node * prev = NULL;
Node * next = NULL;
while (curr != NULL) {
if (curr->right != NULL && prev == curr->right) {
next = curr->parent;
} else if (curr->left == NULL || prev == curr->left) {
cout << curr->data << " "; // <-- visit the node.
next = curr->right != NULL ? curr->right : curr->parent;
} else {
next = curr->left;
}
prev = curr;
curr = next;
}
cout << "\n";
}
我正在研究一个函数,它在C语言中的二进制搜索树中搜索一个与函数一起传入的名称。但是,我一直在想如何设置循环的格式,这样,当遍历到达最左边的节点时,回退不会简单地结束,而没有子节点。遍历必须是预购的(访问我自己,然后访问我的左孩子,然后访问我的右孩子)。 正如您所看到的,当前,当它到达与传递到函数中的字符串不匹配的最左侧节点时,它只返回NULL。如果它没有在树中找到匹配,我必须让它返回NULL,但同
下面是将二叉查找树的前序遍历转换为原始树的代码。 下面的代码采用整数数组,表示二进制搜索树的预序遍历。返回构造树的根。 来源:http://www . geeks forgeeks . org/construct-BST-from-given-preorder-traversal-set-2/ 我无法理解此代码。有人能帮我理解以下内容吗 > 在任何给定的迭代中,堆栈中存储的值与指出的当前值相关 从
主要内容:递归实现,非递归实现二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素。 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 开始,遍历该节点的左子树(以节点 2 为根节点); 遍历节点 2 的左子树(以节点 4 为根节点); 由于节点 4 既没有左子树,也没有右子树,此时访问该节点中的元素 4,并回退到节点 2 ,遍
主要内容:递归实现,非递归实现二叉树中序遍历的实现思想是: 访问当前节点的左子树; 访问根节点; 访问当前节点的右子树; 图 1 二叉树 以图 1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 遍历节点 1 的左子树,找到节点 2; 遍历节点 2 的左子树,找到节点 4; 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树; 由于节点 4 无右子树,因此节点 2 的左子
主要内容:递归实现,非递归实现二叉树先序遍历的实现思想是: 访问根节点; 访问当前节点的左子树; 若当前节点无左子树,则访问当前节点的右子树; 图 1 二叉树 以图 1 为例,采用先序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 访问节点 1 的左子树,找到节点 2; 访问节点 2 的左子树,找到节点 4; 由于访问节点 4 左子树失败,且也没有右子树,因此以节点 4 为根节点的子树遍历完成。但节点
通常我们按顺序、前顺序或后顺序遍历二叉搜索树。但是,当我们按照从右到根到左的递归顺序遍历二叉搜索树时,会发生什么呢? 假设如果我将值存储在数组中,并且与前序遍历相比,当我们按此顺序遍历时,它的时间复杂度是否会增加。