java樹,java樹形結構遞歸實現

本文目錄一覽:

JAVA畫樹

畫什麼都行,這個你得自己實現。我可以給你寫一個畫樹的小程序:

———————————————————

//TreeNode.java

package util;

import java.util.Vector;

public class TreeNode {

private VectorTreeNode children;

private TreeNode parent;

private TreeNode root;

public TreeNode (TreeNode parent) {

children = new VectorTreeNode();

if (parent == null)

root = this;

else {

parent.addChild(this);

}

}

public void addChild (TreeNode n) {

addChild(children.size(), n);

}

public void addChild (int index, TreeNode n) {

children.add(index, n);

n.parent = this;

}

public void removeChild (TreeNode n) {

children.remove(n);

}

public void removeChild (int index) {

children.remove(index);

}

public void setChild (int index, TreeNode n) {

children.set(index, n);

n.parent = this;

}

public TreeNode getChild (int index) {

return children.get(index);

}

public void changePosition (int index1, int index2) {

if (0 = index1 index1 children.size()

0 = index2 index2 = children.size()) {

TreeNode tmp = children.get(index1);

children.set(index1, children.get(index2));

children.set(index2, tmp);

}

}

public void setParent (TreeNode n) {

parent = n;

}

public TreeNode getRoot () {

return root;

}

public TreeNode getParent () {

return parent;

}

public VectorTreeNode getChildren () {

return children;

}

}

————————————————————

//TreePanelNode.java

package ui;

import util.TreeNode;

import java.awt.*;

public class TreePanelNode extends TreeNode {

private int x, y, width, height;

private Object value;

private TreePanelNode parent;

public TreePanelNode (TreePanelNode parent, int x, int y, int width, int height, Object value) {

super(parent);

this.x = x;

this.y = y;

this.parent = parent;

this.width = width;

this.height = height;

this.value = value;

}

public void setLocation (int x, int y) {

this.x = x;

this.y = y;

}

public void setSize (int width, int height) {

this.width = width;

this.height = height;

}

public Rectangle getBounds () {

return new Rectangle(x, y, width, height);

}

public Object getValue () {

return value;

}

public Point getLocation () {

return new Point(x, y);

}

public int getWidth () {

return width;

}

public int getHeight () {

return height;

}

public void setValue (Object value) {

this.value = value;

}

public TreePanelNode getParent () {

return parent;

}

}

————————————————————–

//TreePanel.java

package ui;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.Vector;

public class TreePanel extends JPanel {

private VectorTreePanelNode nodes;

private VectorInteger selectedNodes;

private int tmpX, tmpY;

private int editingNode = -1;

private int addingParent = -2;

private int mouseX, mouseY;

public TreePanel () {

nodes = new VectorTreePanelNode();

selectedNodes = new VectorInteger();

setBackground(Color.WHITE);

addMouseListener(new MouseAdapter() {

public void mousePressed (MouseEvent me) {

tmpX = me.getX();

tmpY = me.getY();

if (nodes.size() == 0) {

addingParent = -1;

}

int i = 0;

for (; inodes.size(); i++) {

if (nodes.get(i).getBounds().contains(mouseX, mouseY)) {

if (me.isControlDown()) {

if (!selectedNodes.contains(i))

selectedNodes.add(i);

else

selectedNodes.removeElement(i);

} else if (!selectedNodes.contains(i)) {

selectedNodes = new VectorInteger();

selectedNodes.add(i);

}

if (me.getClickCount() == 2) {

nodes.get(i).setValue(“”);

editingNode = i;

}

break;

}

}

if (i == nodes.size())

if (!me.isControlDown())

selectedNodes = new VectorInteger();

repaint();

}

public void mouseReleased (MouseEvent me) {

addingParent = -2;

}

});

addMouseMotionListener(new MouseMotionAdapter() {

public void mouseDragged (MouseEvent me) {

mouseX = me.getX();

mouseY = me.getY();

int i = 0;

for (; iselectedNodes.size(); i++) {

if (nodes.get(selectedNodes.get(i)).getBounds().contains(mouseX, mouseY))

break;

}

if (i != selectedNodes.size()) {

if (me.isAltDown() addingParent != -3) {

addingParent = selectedNodes.get(i);

} else {

for (i=0; iselectedNodes.size(); i++) {

nodes.get(selectedNodes.get(i)).setLocation(nodes.get(selectedNodes.get(i)).getLocation().x + mouseX – tmpX,

nodes.get(selectedNodes.get(i)).getLocation().y + mouseY – tmpY);

}

tmpX = mouseX;

tmpY = mouseY;

}

}

repaint();

}

public void mouseMoved (MouseEvent me) {

mouseX = me.getX();

mouseY = me.getY();

}

});

addKeyListener(new KeyAdapter() {

public void keyTyped (KeyEvent ke) {

if (editingNode != -1) {

if (ke.getKeyCode() == KeyEvent.VK_ENTER)

editingNode = -1;

else

nodes.get(editingNode).setValue(nodes.get(editingNode).getValue().toString()+ke.getKeyChar());

repaint();

}

}

});

}

public void paint (Graphics g) {

super.paint(g);

FontMetrics fm = g.getFontMetrics();

if (addingParent -2) {

String str = “node” + nodes.size();

int width = fm.stringWidth(str);

int height = fm.getHeight();

TreePanelNode pnt = null;

if (addingParent != -1)

pnt = nodes.get(addingParent);

nodes.add(new TreePanelNode(pnt, mouseX-width/2-10, mouseY-height/2-20, width+20, height+40, str));

addingParent = -3;

selectedNodes = new VectorInteger();

selectedNodes.add(nodes.size()-1);

}

for (int i=0; inodes.size(); i++) {

String str = nodes.get(i).getValue().toString();

int width = fm.stringWidth(str);

int height = fm.getHeight();

nodes.get(i).setSize(width + 20, height + 40);

if (selectedNodes.contains(i))

g.setColor(Color.RED);

else

g.setColor(Color.BLACK);

if (nodes.get(i).getParent() != null)

g.drawLine(nodes.get(i).getLocation().x+nodes.get(i).getWidth()/2,

nodes.get(i).getLocation().y+nodes.get(i).getHeight()/2,

nodes.get(i).getParent().getLocation().x+nodes.get(i).getParent().getWidth()/2,

nodes.get(i).getParent().getLocation().y+nodes.get(i).getParent().getHeight()/2);

g.drawString(str, nodes.get(i).getLocation().x + 10, nodes.get(i).getLocation().y + 20);

g.drawRect(nodes.get(i).getLocation().x, nodes.get(i).getLocation().y, nodes.get(i).getWidth(), nodes.get(i).getHeight());

}

grabFocus();

}

}

———————————————————-

//MainView.java

package ui;

import javax.swing.*;

public class MainView extends JFrame {

private TreePanel tp;

public MainView () {

super(“TreeDemo”);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(800, 600);

setLocationRelativeTo(null);

tp = new TreePanel();

add(tp);

setVisible(true);

}

public static void main (String args[]) {

new MainView();

}

}

————————————————————

好了。然後你新建一個 util 文件夾 和 一個 ui 文件夾,把第一個文件放在 util 文件夾下,把其餘文件放在 ui 文件夾下,文件名都根據我的注釋就行了。

例如你這兩個文件夾新建在 D 盤下,在命令行中編譯運行:

———————————————————-

…D:

D:\javac util\TreeNode.java ui\TreePanelNode.java ui\TreePanel.java ui\MainView.java

D:\java ui.MainView

———————————————————-

於是便能看到效果。祝您好運,順便我寫了這麼多就給個最佳答案吧,哈哈。

忘了告訴你,按住 Alt 鍵拖動 Node 可以添加子節點。

按住 Ctrl 鍵單擊 node 可以多選。

雙擊一個 node 然後可以從鍵盤輸入 新的字符串,按回車結束。

———————————————————-

如果對以上的程序還有什麼問題,留下郵箱,我直接發給你。

java如何創建一顆二叉樹

計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作“左子樹”(left

subtree)和“右子樹”(right

subtree)。二叉樹常被用作二叉查找樹和二叉堆或是二叉排序樹。

二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的

i

-1次方個結點;深度為k的二叉樹至多有2^(k)

-1個結點;對任何一棵二叉樹T,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0

=

n2

+

1。

樹是由一個或多個結點組成的有限集合,其中:

⒈必有一個特定的稱為根(ROOT)的結點;

二叉樹

⒉剩下的結點被分成n=0個互不相交的集合T1、T2、……Tn,而且,

這些集合的每一個又都是樹。樹T1、T2、……Tn被稱作根的子樹(Subtree)。

樹的遞歸定義如下:(1)至少有一個結點(稱為根)(2)其它是互不相交的子樹

1.樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為2;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。

2.樹的深度——組成該樹各結點的最大層次。

3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林;

4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。

樹的表示

樹的表示方法有許多,常用的方法是用括號:先將根結點放入一對圓括號中,然後把它的子樹由左至右的順序放入括號中,而對子樹也採用同樣的方法處理;同層子樹與它的根結點用圓括號括起來,同層子樹之間用逗號隔開,最後用閉括號括起來。如右圖可寫成如下形式:

二叉樹

(a(

b(d,e),

c(

f(

,g(h,i)

),

)))

java中如何建立一個java樹,請詳解?

import java.awt.*;

import javax.swing.*;

class TreeDemo extends JFrame

{

public TreeDemo()

{

setSize(400,300);

setTitle(“演示怎樣使用JTree”);

show();

JScrollPane jPanel=new JScrollPane();

getContentPane().add(jPanel);

JTree jtree=new JTree();

jPanel.getViewport().add(jtree,null);

validate();

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

public class Example5_25

{

public static void main(String[] args)

{

TreeDemo frame=new TreeDemo();

}

}

其中JScrollPane是一個帶滾動條的面板類。

將對象加入到帶滾動條的面板類中,在將已建的數放入到其中。

就可建立一個系統默認的樹結構。

java實現tree樹性能如何

樹與二叉樹實現差不多,二叉樹類變量裡面有兩個節點,通過配置一些參數讓數據庫性能達到最優。

用Java實現的數據樹形封裝。

樹在java中的應用有哪些

首先:樹與線性表、棧、隊列等線性結構不同,樹是一種非線性結構。一棵樹只有一個根節點,如果一棵樹有了多個根節點,那它已經不再是一棵樹了,而是多棵樹的集合,也被稱為森林。

其次:java中樹的應用主要有:菜單樹,還有權限樹,商品分類列表也是樹結構。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/244862.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:04
下一篇 2024-12-12 13:04

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論