当我创建BST时,在插入节点期间,我会检查新节点的值是小于左子节点还是大于右子节点。我向下走,直到找到插入节点的正确位置。现在假设我有一个二叉树,我想创建一个树,我该怎么做?我是否需要使用BFS算法来做到这一点?
谢谢
答案 0 :(得分:3)
这不是插入应该如何在BST中起作用, 新值应该与当前节点进行比较而不是它的子节点,如果它小于当前节点遍历的值,如果有一个左节点将值与它进行比较,如果没有左节点存在则在那里插入值。右侧也是如此,但如果比较结果大于当前节点(BST中没有重复值)。
您的问题是关于如何创建二进制树而不是BST, 如果你想要一个构造完整二叉树的简单二叉树,那么只需从左到右逐层插入节点。当然BFS是逐层工作的,但它是一种搜索算法,因为你是从头开始构建它所以不需要搜索树。
修改强>: 如果你想要一个更简单的二叉树构造版本,只需在一个分支中一直向下插入2个节点而不需要回溯,即使你也插入了1个节点,它仍然是一个二叉树。
Enother Edit : 每个 BST 都是二叉树,每个二叉树都是树 并且这个论点不能被反转(例如,不是每个BT都是BST ......等等)。所以,如果你有BT,它已经是一棵树。
此致
答案 1 :(得分:1)
在这里,我制作一个基于权重的二叉树,这对BFS有好处,因为它可以保持树的平衡。
我在Java
:
class BT_Node
{
public int value;
public int depth;
public long weight;
public BT_Node left, right;
public BT_Node (int value, int depth)
{
this.depth = depth;
this.value = value;
this.weight = 0;
this.left = this.right = null;
}
}
class BT
{
private BT_Node root;
public long size ()
{
return (root!=null ? root.weight : 0);
}
public long size (BT_Node node)
{
return (node!=null ? node.weight : 0);
}
public void insert (int value)
{
int depth = 0;
BT_Node parent = root;
if (root == null)
{
root = new BT_Node (value, 0);
}
else
{
root.weight++;
while (parent.left!=null && parent.right!=null)
{
if (parent.left.weight <= parent.right.weight)
parent=parent.left;
else
parent=parent.right;
parent.weight++;
}
if (parent.left == null)
parent.left = new BT_Node (value, parent.depth+1);
else
parent.right = new BT_Node (value, parent.depth+1);
}
}
}