我需要创建一个未排序的二叉树(一个要求是未排序的),它将String
作为其值。我的班级大纲看起来像这样:
public class Node {
private String desc;
private Node leftNode = null;
private Node rightNode = null;
public Node(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
public Node getLeftNode() {
return leftNode;
}
public Node getRightNode() {
return rightNode;
}
}
最终,我希望能够将具有String
描述的任何节点替换为具有新描述的新节点(包括带有旧描述的重复节点)。
所以我的问题是,在创建未排序的二叉树时,处理Node
的插入的最佳方法是什么?
setLeftNode(Node root, String desc)
和setRightNode(Node root, String desc)
,有人可以使用他们选择的Node
作为根。如果已经有左/右Node
,那么它只会前进直到它遇到没有左Node
的节点。但这可能通过产生超大的高度来引入问题。
我想到的第二种方法是拥有专用的根Node
,在这种情况下创建第一个Node
,然后按顺序构建新的Node
。< / p>
那么创建未排序的二叉树的最佳方法是什么?
答案 0 :(得分:2)
public class BinaryTree{
private BinaryTree right;
private BinaryTree left;
private String data;
public BinaryTree(String s){
data = s;
right = null;
left = null;
}
public void setLeft (BinaryTree l){ left = l; }
public void setRight(BinaryTree r){ right = r; }
}
你的问题表明树应该是平衡的,所以插入一个元素时,你应该递归地检查树每一侧的节点数:
public int checkTree(){
if(left == null && right == null){
return 1;
}else if(left == null){
return 1 + right.checkTree();
}else if(right == null){
return 1 + left.checkTree();
}else{
return 1 + left.checkTree() + right.checkTree();
}
}
public void insert(BinaryTree bt){
if(left == null){
setLeft(bt);
}else if(right == null){
setRight(bt);
}else{
if(left.checkTree() <= right.checkTree()){
left.insert(bt);
}else{
right.insert(bt);
}
}
}
编辑:
public class BinaryTree {
private BinaryTree right;
private BinaryTree left;
private String data;
private int weight;
public BinaryTree(String s){
data = s;
right = null;
left = null;
weight = 1;
}
public void setLeft (BinaryTree l){
left = l;
weight++;
}
public void setRight(BinaryTree r){
right = r;
weight++;
}
public int getWeight(){ return weight; }
public void insert(BinaryTree bt){
if(left == null){
setLeft(bt);
}else if(right == null){
setRight(bt);
}else{
if(left.getWeight() <= right.getWeight()){
left.insert(bt);
weight++;
}else{
right.insert(bt);
weight++;
}
}
}
}
答案 1 :(得分:1)
根据定义,二叉树的左边是最低的元素,右边是最高的元素。但是如果你真的希望所有搞砸了(排序)你可以调用一个导致0或1的rand函数,如果是0然后向左移动,如果1向右移动,则随机。这将导致未排序的树
答案 2 :(得分:1)
最终我希望能够替换任何与String匹配的节点 描述与具有新描述的新节点(包括 与旧描述重复。)
为此,您必须搜索整个树:
private Node searchBasedOnValue(String desc, Node currentNode)
{
Node result = null
if (currentNode == null)
return null;
if (currentNode.getDesc().equals(desc))
return currentNode ;
if (currentNode.getLeftNode() != null)
result = searchBasedOnValue(desc,currentNode.getLeftNode());
if (result == null)
result = searchBasedOnValue(desc,currentNode.getRightNode());
return result;
}
IMO,常规Binary Tree
永远不会被排序,排序的名称为Binary Search Tree
。对于插入,您需要按照您想要的方式处理。可能是您可以在树的左右子项中插入节点,以便在某种程度上平衡它。这取决于你如何照顾它。
我没有看到常规Binary Tree
的实际用法,因为大多数时候我们使用Binary Search Tree
在插入,删除和查找方面具有更好的性能(lg(n)
)。< / p>
答案 3 :(得分:0)
如果它没有排序,为什么要构建二叉树呢?你无法在不进行全面扫描的情况下进行搜索,所以你也可以把所有内容放在一个数组中,因为访问任何元素都是O(n),因为无法搜索。
答案 4 :(得分:0)
这是构建未排序二叉树的最快方法,其形状没有任何限制:
首先你需要一个像这样的构造函数:
public Node(String desc, Node left, Node right) {
this.desc = desc;
this.left = left;
this.right = right;
}
然后像这样构建树:
Node root = null;
for (String input: ...) {
root = new Node(input, root, null);
}
显然,这会给你一个不平衡的,未排序的树,搜索需要查看所有节点。但是,如果树未分类,那么树不平衡的事实没有区别。
通常,搜索未排序的树与搜索列表具有相同的复杂性,并且代码更复杂。