伪代码——搜索树
Pseudocode - Search Tree
我需要一些帮助来解决以下问题。有一个搜索树(二叉搜索树),我需要找到一个特定的元素,所以要搜索搜索树。但这只需要在伪代码中显示(所以不需要实际的搜索树,所以只是举个例子根是75,需要搜索的元素是24)。
例如,第 1 步:打印根,第 2 步:打印树....(直到找到正确的元素)。
到目前为止我已经这样做了:
1) def findval (node, lookForElement):
2)当节点不为空时:
3) 如果 node.val 等于 lookForElement:
4) 中断
5) 如果 node.val 小于 lookForElement:
6)节点=node.right
7) 其他:
8)节点=node.left
9) return 节点
10) 如果节点为空:
11) 打印 "tree is empty"
但我认为这仅在搜索到的元素是下一个向下元素时才有效,但搜索到的元素可能向下几个分支,因此我该如何正确循环?
您找到节点的算法非常正确:
DEF FINDVAL(search)
LET node = root
WHILE node != null
PRINT_ELEMENTS(node)
IF node.value == search
BREAK
ELSE IF node.value < search
node = node.right
ELSE
node = node.left
RETURN node
缩进和 space 使 return 语句应该在 WHILE 循环之外更清楚。您只能通过跳出循环来到达它,这发生在您找到搜索值(万岁!)或节点变为空时。如果节点为空,那么我们想要的值不在树中。
具有以下树:
75
/ \
18 88
/ \ \
6 24 90
FINDVAL 算法将显示以下内容:
6, 18, 24, 75, 88, 90
6, 18, 24
24
更新:要插入一个新值,如果它不存在的话:
DEF INSERTVAL(value)
LET node = root
WHILE node != null
PRINT_ELEMENTS(node)
IF node.value == value
PRINT("Value already exists")
RETURN
ELSE IF node.value < value
IF node.right == null
node.right = new Node(value)
RETURN
node = node.right
ELSE
IF node.left == null
node.left = new Node(value)
RETURN
node = node.left
root = new Node(value)
这个伪代码可能看起来有点难以理解,因为我们必须一次查看树中的两层,而不是一层。我们查看父级,决定是向左还是向右,然后如果该方向为空,我们将插入新值。如果它不为空,我们继续到该节点并重复。
现在,退出 while 循环的唯一方法仍然是 'node' 为 null,或者我们 return 从循环中退出。但是在循环中,每次我们向下移动一个节点时,首先我们检查它是否为空,如果是,我们插入 and return。所以 'node' 的值唯一可以为空的情况是根为空。
我需要一些帮助来解决以下问题。有一个搜索树(二叉搜索树),我需要找到一个特定的元素,所以要搜索搜索树。但这只需要在伪代码中显示(所以不需要实际的搜索树,所以只是举个例子根是75,需要搜索的元素是24)。
例如,第 1 步:打印根,第 2 步:打印树....(直到找到正确的元素)。
到目前为止我已经这样做了:
1) def findval (node, lookForElement):
2)当节点不为空时:
3) 如果 node.val 等于 lookForElement:
4) 中断
5) 如果 node.val 小于 lookForElement:
6)节点=node.right
7) 其他:
8)节点=node.left
9) return 节点
10) 如果节点为空:
11) 打印 "tree is empty"
但我认为这仅在搜索到的元素是下一个向下元素时才有效,但搜索到的元素可能向下几个分支,因此我该如何正确循环?
您找到节点的算法非常正确:
DEF FINDVAL(search)
LET node = root
WHILE node != null
PRINT_ELEMENTS(node)
IF node.value == search
BREAK
ELSE IF node.value < search
node = node.right
ELSE
node = node.left
RETURN node
缩进和 space 使 return 语句应该在 WHILE 循环之外更清楚。您只能通过跳出循环来到达它,这发生在您找到搜索值(万岁!)或节点变为空时。如果节点为空,那么我们想要的值不在树中。
具有以下树:
75
/ \
18 88
/ \ \
6 24 90
FINDVAL 算法将显示以下内容:
6, 18, 24, 75, 88, 90
6, 18, 24
24
更新:要插入一个新值,如果它不存在的话:
DEF INSERTVAL(value)
LET node = root
WHILE node != null
PRINT_ELEMENTS(node)
IF node.value == value
PRINT("Value already exists")
RETURN
ELSE IF node.value < value
IF node.right == null
node.right = new Node(value)
RETURN
node = node.right
ELSE
IF node.left == null
node.left = new Node(value)
RETURN
node = node.left
root = new Node(value)
这个伪代码可能看起来有点难以理解,因为我们必须一次查看树中的两层,而不是一层。我们查看父级,决定是向左还是向右,然后如果该方向为空,我们将插入新值。如果它不为空,我们继续到该节点并重复。
现在,退出 while 循环的唯一方法仍然是 'node' 为 null,或者我们 return 从循环中退出。但是在循环中,每次我们向下移动一个节点时,首先我们检查它是否为空,如果是,我们插入 and return。所以 'node' 的值唯一可以为空的情况是根为空。