如何java 图形化二叉搜索树

dixin2011 山东大学 学生  2013-02-21 10:29:27
二叉树的创建、插入、删除、搜索已经完成,但是不知道怎么用图形画出来
完成部分代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Node
{
int data;
Node left;
Node right;

Node(){}

Node(int data)
{
this.data = data;
left = null;
right = null;
}
}

//插入节点
class BiSTree
{
Node root=new Node();
//插入
public void Insert(Node root, int data)
{
if (root.data == 0)
{
root.data = data;
}
else
if (data == root.data)
{
System.out.println("关键值"+data+"重复,已合并");
}
else{
if (data < root.data)
{
if (root.left == null)
{
root.left = new Node(data);
}
else
{
Insert(root.left, data);
}

}
else
{
if (root.right == null)
{
root.right = new Node(data);
}
else
{
Insert(root.right, data);
}}}
}
//创建
public void Create(String[] args) {
for (int i = 0; i < args.length; i++) {
Insert(root, Integer.parseInt(args[i]));
}
}
//中序遍历
public void InOrder(Node root)
{
if (root == null)
return;
InOrder(root.left);
System.out.print(root.data + " ");
BiSortTreePanel.textarea.append(root.data + " ");
InOrder(root.right);
}
//搜索
public boolean Search(Node root, int key)
{
boolean bl = false;
if (root == null) {
bl = false;
return bl;
}
else if (root.data == key) {
bl = true;
System.out.println("找到元素"+key);
return bl;
}
else if (key >= root.data)
{
return Search(root.right, key);
}
return Search(root.left, key);
}
//删除
public boolean Delete(int data)
{
Node current = root; //当前节点
Node parent = null; //当前节点的父节点
boolean isLchild = false; //标记current是parent的左子树还是右子树
//查找data在树中对应的节点
while(current != null && data != current.data)
{
//改变parent引用
parent = current;

if(data < current.data)
{
//data小于current.data时,current改变为current的lchild节点
current = current.left;
isLchild = true;
continue ;
}

if(data > current.data)
{
//data大于current.data时,current改变为current的rchild节点
current = current.right;
isLchild = false;
continue ;
}
}
//如果current==null说明树中没有值为data的节点.
if(current == null)
{
//BiSortTreePanel.output.setText("没有值为 "+data+" 的结点!");
System.out.println("没有值为 "+data+"的结点!");
return false;
}
//此处以上的代码经检验是正确的.此时查找到的current的data为目标data
//也就是说,此时的current是要删除的节点

if(current.left == null && current.right == null)
{
//current没有子节点, 直接根据isLchild将parent指向current的引用切断
if(isLchild)
{
parent.left = null;
}
else
{
parent.right = null;
}
}

else if(current.left != null && current.right == null)
{
//current只有左子节点, 根据isLchild切断parent指向current的引用,
//让它指向current的左子节点
if(isLchild)
{
parent.left = current.left;
}
else
{
parent.right = current.left;
}
}

else if(current.left == null && current.right != null)
{
//current只有右子节点, 根据isLchild切断parent指向current的引用,
//让它指向current的右子节点
if(isLchild)
{
parent.left = current.right;
}
else
{
parent.right = current.right;
}
}

else
{
//以下代码是查找current的后继节点(current右子树中的最小值节点)
//重构current的右子树的过程.
Node subsequence; //后继节点
if(current.right.left == null)
{
//如果current.rchild.lchild为空,说明后继节点就是current.rchild
subsequence = current.right;
}
else
{
//设置后继节点和后继节点父节点的初值.
subsequence = current.right; //后继节点
Node previouSubsequence = current; //后继节点的父节点
while(subsequence.left != null)
{
//由于后继节点是最小值节点.而二叉搜索树当前节点的左子节点值
//总是小于当前节点,所以子树中的最后一个左子树的根就是后继节点
previouSubsequence = subsequence;
subsequence = subsequence.left;
}
//重构右current的右子树.
//后继节点的前一个节点断开与后继节点的引用,
//指向后继节点的右子节点.
//这里因为后继节点是最后一个左子树的根节点,所以一定不存在左子节点.
//因此下面的代码能够保证树中数据的完整性.
previouSubsequence.left = subsequence.right;
subsequence.right = current.right;
//至此,通过后继节点完成了对current的右子树的重构
}
//由后继节点的左子节点指向current的左子树.
subsequence.left = current.left;
//至此,完成了对current子树的重构,下面的代码只是根据isLchild将其
//和parent节点链接起来,并切断parent和current的引用.
if(isLchild)
{
parent.left = subsequence;
}
else
{
parent.right = subsequence;
}
}
//删除完成, 返回true;
System.out.println("删除完成!");
return true;
}

}
//测试类
class BiSortTreePanel extends Panel implements ActionListener
{
class GraphicPanel extends Panel //想
{ //在
boolean st = true; //这
GraphicPanel() //里
{ //画
setSize(650,450); //出
setLayout(null); //二
setBackground(Color.lightGray);//叉
setBounds(500,0,500,500); //树
}
}
JLabel label1=new JLabel("新建");
JLabel label2=new JLabel("二叉排序树");
JLabel label3=new JLabel("插入");
JLabel label4=new JLabel("删除");
JLabel label5=new JLabel("查找");

JTextField text1=new JTextField();
JTextField text2=new JTextField();
JTextField text3=new JTextField();
JTextField text4=new JTextField();
static JLabel output=new JLabel("提示:请在新建框输入整型数据,用空格隔开创建");

static JTextArea textarea=new JTextArea();

BiSTree BST=new BiSTree();
BiSortTreePanel()
{
setLayout(null);

GraphicPanel graphicpanel=new GraphicPanel();
add(graphicpanel);

add(label1);
label1.setBounds(10,10,35,15);
add(label2);
label2.setBounds(200,15,150,15);
add(text1);
text1.setBounds(10,40,435,35);

add(label3);
label3.setBounds(10,100,55,15);
add(text2);
text2.setBounds(65,95,100,25);

add(label4);
label4.setBounds(290,100,55,15);
add(text3);
text3.setBounds(345,95,100,25);

add(label5);
label5.setBounds(10,150,55,15);
add(text4);
text4.setBounds(65,145,100,25);

add(output);
output.setForeground(Color.blue);
output.setBounds(10,220,300,25);

add(textarea);
textarea.setBounds(10,250,440,100);
textarea.setLineWrap(true); //设置文本区自动换行

text1.addActionListener(this);
text2.addActionListener(this);
text3.addActionListener(this);
text4.addActionListener(this);


setSize(1000,500);
setBackground(Color.GRAY);
}

public void actionPerformed(ActionEvent e)
{
if(e.getSource()==text1) //创建
{
if (BST.root.data != 0) //解决再次创建时的出错.
{
BST.root.data=0;
BST.root.left=null;
BST.root.right=null;
}
String temp=text1.getText();
String [] input=temp.split("\\s");
BST.Create(input);
textarea.setText(null);
BST.InOrder(BST.root);
output.setText("二叉排序树已建立!");
}

if(e.getSource()==text2) //插入
{
String temp=text2.getText();
BST.Insert(BST.root,Integer.parseInt(temp));
textarea.setText(null);
BST.InOrder(BST.root);
output.setText("已插入值为 "+temp+" 的结点");
}

if(e.getSource()==text3) //删除
{
String temp=text3.getText();

if(BST.Delete(Integer.parseInt(temp)))
{
output.setText("已删除值为 "+temp+" 的结点");
textarea.setText(null);
BST.InOrder(BST.root);
}

else
output.setText("没有值为 "+temp+" 的结点");
}

if(e.getSource()==text4) //查找
{
String temp=text4.getText();
if(BST.Search(BST.root,Integer.parseInt(temp)))
output.setText("找到了 "+temp);

else
output.setText("没有找到 "+temp);
}}
}


public class BSTree extends JFrame
{
BSTree()
{
setLayout(null);
BiSortTreePanel bisorttreepanel=new BiSortTreePanel();
add(bisorttreepanel);

setVisible(true);
setBounds(200,100,1000,500);
}


public static void main(String[] args) {
new BSTree();
}
}

怎么在创建树时同时画出结点,在二叉树操作时最好能动态演示
...全文
134 5 点赞 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wangdong20 2013-02-25
要随时改变树叶之间的间距,如果每次在绘图前要先确定树叶之间的间距,不同层之间的间距 比如,某个时刻层数是m,那么每层间隔是getHeight() / m 树叶之间的间距也是如法炮制
  • 打赏
  • 举报
回复
S孙大宝 2013-02-21
貌似很复杂 ,不过没有什么实际意义啊。。。
  • 打赏
  • 举报
回复
dixin2011 2013-02-21
对java画图不了解啊,希望能给点更详细的说明
  • 打赏
  • 举报
回复
rumlee 2013-02-21
把树转换成图形还不容易吗,直接用图形画就是了。
  • 打赏
  • 举报
回复
科學信仰 2013-02-21
引用 2 楼 dixin2011 的回复:
对java画图不了解啊,希望能给点更详细的说明
比如表示二叉树的是一个LinkNode对象列表,创建时是动态地将LinkNode插入该列表中,利用java画图就可以动态表现出来,可以用设计模式中的MVC来形容。关于画图,楼主还要自己去搜索一下
  • 打赏
  • 举报
回复
相关推荐
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2013-02-21 10:29
社区公告
暂无公告