我的目标是为伪帕斯卡代码的编译器创建一个BST(二进制搜索树)。
据我所知,BST的工作原理如下:我有一个根,它有一些关键 - 依赖于我的生成密钥(如果它大于或小于根密钥)我从左边或右边插入一个节点根
显然,如果我使用数字作为键,树就会像:
1
\
2
\
3
我想要的是平衡的BST,如下所示:
1
/ \
2 3
... etc.
这些钥匙显然不会发生。当我想要实现这种结构时,节点的键应该如何?有没有办法在不记住最后插入的密钥的情况下执行此操作?
这也让我想到了什么“关键”应该用于树的绝对根?所以我可以从左边和右边添加键吗?
答案 0 :(得分:2)
插入节点时,从根节点向下移动以找到正确的插入点:
1 1 1
\ \
2 2
\
3
插入后,当您返回到root时,检查每个左右节点是否足够均衡。如果没有,你可以旋转它们:
1 2
\ / \
2 1 3
\
3
这意味着更深层分支的第一个节点到达新的根节点,旧的根节点将成为该节点的子节点。
因此,根节点将在必要时更改,并且始终具有“最中间”值。
答案 1 :(得分:1)
应用AVL tree
的概念来平衡树结构。
根据您的要求:
1
/ \
2 3
上述树的构建仅考虑binary tree
而不是binary Search Tree
。
然而,上面提到的树可以通过从上到下和从左到右的方式构建。