编程初学者,想用JAVA做一个二叉树界面,求指点。

Python012

编程初学者,想用JAVA做一个二叉树界面,求指点。,第1张

建议你先再java中使用swing做一个这样的JTextField或者JTextArea组成的结构。

你可以先new一个JPanel上面使用GridLayout(7,15)布局管理器,依次add组件。空白位置add(new JPanel()),需要文本框覆盖的位置add文本框或者文本域组件。

然后预览后发现这些文本框按照你的想法都排列在哪里。

这时候再截图(仅这个java窗口),然后把截图放到ps里面,然后设置预览比例为100%。进行1:1比例画图吧。保存图片。

然后再java程序里,为JFrame添加图片,位置和分辨率就可以设置为(0,0,x,y),x和y是JFrame的长和宽。

二叉树的相关操作,包括创建,中序、先序、后序(递归和非递归),其中重点的是java在先序创建二叉树和后序非递归遍历的的实现。

package com.algorithm.tree

import java.io.File

import java.io.FileNotFoundException

import java.util.Queue

import java.util.Scanner

import java.util.Stack

import java.util.concurrent.LinkedBlockingQueue

public class Tree {

private Node root

public Tree() {

}

public Tree(Node root) {

this.root = root

}

//创建二叉树

public void buildTree() {

Scanner scn = null

try {

scn = new Scanner(new File("input.txt"))

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

root = createTree(root,scn)

}

//先序遍历创建二叉树

private Node createTree(Node node,Scanner scn) {

String temp = scn.next()

if (temp.trim().equals("#")) {

return null

} else {

node = new Node((T)temp)

node.setLeft(createTree(node.getLeft(), scn))

node.setRight(createTree(node.getRight(), scn))

return node

}

}

//中序遍历(递归)

public void inOrderTraverse() {

inOrderTraverse(root)

}

public void inOrderTraverse(Node node) {

if (node != null) {

inOrderTraverse(node.getLeft())

System.out.println(node.getValue())

inOrderTraverse(node.getRight())

}

}

//中序遍历(非递归)

public void nrInOrderTraverse() {

Stack<Node>stack = new Stack<Node>()

Node node = root

while (node != null || !stack.isEmpty()) {

while (node != null) {

stack.push(node)

node = node.getLeft()

}

node = stack.pop()

System.out.println(node.getValue())

node = node.getRight()

}

}

//先序遍历(递归)

public void preOrderTraverse() {

preOrderTraverse(root)

}

public void preOrderTraverse(Node node) {

if (node != null) {

System.out.println(node.getValue())

preOrderTraverse(node.getLeft())

preOrderTraverse(node.getRight())

}

}

//先序遍历(非递归)

public void nrPreOrderTraverse() {

Stack<Node>stack = new Stack<Node>()

Node node = root

while (node != null || !stack.isEmpty()) {

while (node != null) {

System.out.println(node.getValue())

stack.push(node)

node = node.getLeft()

}

node = stack.pop()

node = node.getRight()

}

}

//后序遍历(递归)

public void postOrderTraverse() {

postOrderTraverse(root)

}

public void postOrderTraverse(Node node) {

if (node != null) {

postOrderTraverse(node.getLeft())

postOrderTraverse(node.getRight())

System.out.println(node.getValue())

}

}

//后续遍历(非递归)

public void nrPostOrderTraverse() {

Stack<Node>stack = new Stack<Node>()

Node node = root

Node preNode = null//表示最近一次访问的节点

while (node != null || !stack.isEmpty()) {

while (node != null) {

stack.push(node)

node = node.getLeft()

}

node = stack.peek()

if (node.getRight() == null || node.getRight() == preNode) {

System.out.println(node.getValue())

node = stack.pop()

preNode = node

node = null

} else {

node = node.getRight()

}

}

}

//按层次遍历

public void levelTraverse() {

levelTraverse(root)

}

public void levelTraverse(Node node) {

Queue<Node>queue = new LinkedBlockingQueue<Node>()

queue.add(node)

while (!queue.isEmpty()) {

Node temp = queue.poll()

if (temp != null) {

System.out.println(temp.getValue())

queue.add(temp.getLeft())

queue.add(temp.getRight())

}

}

}

}

//树的节点

class Node {

private Node left

private Node right

private T value

public Node() {

}

public Node(Node left,Node right,T value) {

this.left = left

this.right = right

this.value = value

}

public Node(T value) {

this(null,null,value)

}

public Node getLeft() {

return left

}

public void setLeft(Node left) {

this.left = left

}

public Node getRight() {

return right

}

public void setRight(Node right) {

this.right = right

}

public T getValue() {

return value

}

public void setValue(T value) {

this.value = value

}

}

测试代码:

package com.algorithm.tree

public class TreeTest {

/**

* @param args

*/

public static void main(String[] args) {

Tree tree = new Tree()

tree.buildTree()

System.out.println("中序遍历")

tree.inOrderTraverse()

tree.nrInOrderTraverse()

System.out.println("后续遍历")

//tree.nrPostOrderTraverse()

tree.postOrderTraverse()

tree.nrPostOrderTraverse()

System.out.println("先序遍历")

tree.preOrderTraverse()

tree.nrPreOrderTraverse()

//

}

}

首先我想问为什么要用LinkedList 来建立二叉树呢? LinkedList 是线性表,

树是树形的, 似乎不太合适。

其实也可以用数组完成,而且效率更高.

关键是我觉得你这个输入本身就是一个二叉树啊,

String input = "ABCDE F G"

节点编号从0到8. 层次遍历的话:

对于节点i.

leftChild = input.charAt(2*i+1)//做子树

rightChild = input.charAt(2*i+2)//右子树

如果你要将带有节点信息的树存到LinkedList里面, 先建立一个节点类:

class Node{

public char cValue

public Node leftChild

public Node rightChild

public Node(v){

this.cValue = v

}

}

然后遍历input,建立各个节点对象.

LinkedList tree = new LinkedList()

for(int i=0i<input.lengthi++)

LinkedList.add(new Node(input.charAt(i)))

然后为各个节点设置左右子树:

for(int i=0i<input.lengthi++){

((Node)tree.get(i)).leftChild = (Node)tree.get(2*i+1)

((Node)tree.get(i)).rightChild = (Node)tree.get(2*i+2)

}

这样LinkedList 就存储了整个二叉树. 而第0个元素就是树根,思路大体是这样吧。