因此,我必须为二叉树编写一个插入函数以使其成为二叉搜索树,但是我遇到了一些麻烦。一切都是功能,所以我知道没有状态的概念。因此,在插入时,我需要一遍又一遍地递归地创建树。我在围绕这个想法时遇到了麻烦。
treenode -> procedure(val, left, right) procedure(some) if some then -(some, 1) then right else left else val
这使我可以创建节点并访问值,像这样(左代表一棵空树),左子树和右子树:
.treenode(4, 0, 0)
要创建更复杂的树,我可以这样做:
.treenode(4, .treenode(3, 0, 0), .treenode(6, .treenode(2, 0, 0), 0))
我已经插入到一棵空树上了。
insert -> procedure(root, value) if empty(root) then .treenode(value, 0, 0) else insert_recursive(root, .treenode(value, 0, 0)
在这里我无法弄清楚如何插入到这样的树中。用这种语言没有状态的概念,因此我需要以某种方式将带有值的新节点递归地附加到当前树上。如果有人可以给我一个提示,我将不胜感激。我应该这样称呼它:
tree = empty
tree = insert(tree, 4)
tree = insert(tree, 6)
....
and so on
答案 0 :(得分:2)
我以前从未见过这种语法,所以如果我语法错误,请多多包涵。希望代码演示了需要做的事情-
项目符号要点对应于以下编号的注释-
insert -> procedure(root, value)
if empty(root) then #1
.treenode(value, 0, 0)
else if value < root.value #2
.treenode (root.value, insert(root.left, value), root.right)
else if value > root.value #3
.treenode (root.value, root.left, insert(root.right, value))
else #4
root
StackOverflow允许我们直接在答案文章中运行JavaScript代码段。这是一个可正常运行的代码段,可让您实际了解这一概念-
const empty =
{}
const treenode = (value, left = empty, right = empty) =>
({ value, left, right })
const insert = (t, value) =>
t === empty
? treenode (value, empty, empty)
: value < t.value
? treenode (t.value, insert (t.left, value), t.right)
: value > t.value
? treenode (t.value, t.left, insert (t.right, value))
: t
const print = (t, pre = '', child = '') =>
t === empty
? pre + '∅\n'
: print
( t.right
, child + '┌── '
, child + '. '
)
+ pre + String (t.value) + '\n'
+ print
( t.left
, child + '└── '
, child + '. '
)
let tree = empty
tree = insert (tree, 4)
tree = insert (tree, 6)
tree = insert (tree, 9)
tree = insert (tree, 3)
tree = insert (tree, 5)
tree = insert (tree, 1)
console.log (print (tree))
程序将打印构造的tree
。 ∅
符号表示空-
. . . ┌── ∅
. . ┌── 11
. . . └── ∅
. ┌── 9
. . └── ∅
┌── 6
. . ┌── ∅
. └── 5
. . └── ∅
4
. ┌── ∅
└── 3
. . ┌── ∅
. └── 1
. . └── ∅