写了一个java二叉树,大家提提意见

wang_zheng_wz 2004-04-10 11:34:32
单纯为了研究算法,目前还未发现本类可应用于实际中


import java.util.*;


public class BiTree {
private Object data;
private BiTree leftChild;
private BiTree rightChild;

public BiTree() {}

public BiTree(Object data) {
this.data = data;
}

public Object getData() {
return data;
}

public void setData(Object data) {
this.data = data;
}

public BiTree getLeftChild() {
return leftChild;
}

public void setLeftChild(BiTree bt) {
leftChild = bt;
}

public BiTree getRightChild() {
return rightChild;
}

public void setRightChild(BiTree bt) {
rightChild = bt;
}

// 先序二叉树字符串
public String toStringByPreOrder() {
StringBuffer result = new StringBuffer();
result.append(data);
result.append(" ");
result.append(leftChild == null ? "null " : leftChild.toStringByPreOrder());
result.append(rightChild == null ? "null " : rightChild.toStringByPreOrder());
return result.toString();
}

// 中序二叉树字符串
public String toStringByInOrder() {
StringBuffer result = new StringBuffer();
result.append(leftChild == null ? "null " : leftChild.toStringByInOrder());
result.append(data);
result.append(" ");
result.append(rightChild == null ? "null " : rightChild.toStringByInOrder());
return result.toString();
}

// 后序二叉树字符串
public String toStringByAfterOrder() {
StringBuffer result = new StringBuffer();
result.append(leftChild == null ? "null " : leftChild.toStringByAfterOrder());
result.append(rightChild == null ? "null " : rightChild.toStringByAfterOrder());
result.append(data);
result.append(" ");
return result.toString();
}

// 先序生成二叉树
public static BiTree createBiTreeByPreOrder(Iterator it) {
BiTree bt = null;
Object o = it.next();
if (o != null) {
bt = new BiTree(o);
bt.setLeftChild(createBiTreeByPreOrder(it));
bt.setRightChild(createBiTreeByPreOrder(it));
}
return bt;
}

// 中序生成二叉树
public static BiTree createBiTreeByInOrder(Iterator it) {
BiTree bt = null;
Object o = it.next();
if (o != null) {
bt = new BiTree();
bt.setLeftChild(createBiTreeByInOrder(it));
bt.setData(o);
bt.setRightChild(createBiTreeByInOrder(it));
}
return bt;
}

// 后序生成二叉树
public static BiTree createBiTreeByAfterOrder(Iterator it) {
BiTree bt = null;
Object o = it.next();
if (o != null) {
bt = new BiTree();
bt.setLeftChild(createBiTreeByAfterOrder(it));
bt.setRightChild(createBiTreeByAfterOrder(it));
bt.setData(o);
}
return bt;
}

public static void main(String[] args) {
System.out.println("-------------------- bt ---------------------");
BiTree bt = new BiTree("A");
bt.setLeftChild(new BiTree("B"));
bt.setRightChild(new BiTree("C"));
System.out.println("pre order : " + bt.toStringByPreOrder());
System.out.println("in order : " + bt.toStringByInOrder());
System.out.println("after order : " + bt.toStringByAfterOrder());

System.out.println("-------------------- bt2 ---------------------");
BiTree bt2 = null;
Object[] sequence = new Object[] {
"A", "B", "C", null, null, "D", "E", null,
"G", null, null, "F", null, null, null };
List l = Arrays.asList(sequence);
System.out.println("sequence : " + l);

bt2 = createBiTreeByPreOrder(l.iterator());
System.out.println("pre order : " + bt2.toStringByPreOrder());

bt2 = createBiTreeByInOrder(l.iterator());
System.out.println("in order : " + bt2.toStringByInOrder());

bt2 = createBiTreeByAfterOrder(l.iterator());
System.out.println("after order : " + bt2.toStringByAfterOrder());
}
}
...全文
423 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang_zheng_wz 2004-04-24
  • 打赏
  • 举报
回复
diaopeng(遥远) ,首先谢谢你的意见,搞java如果单纯用api,用不到什么具体算法,注重的是系统架构设计,这类人按你的说法可能是低手,而开发工具、中间件和架构底层支持包的人用算法用得多,按你的说法可能是高手吧。其次我当时连什么是前序遍历二叉树都忘了,更谈不上其它相关算法了,后来翻书又回忆起来了,就好像小时候背了一首唐诗,时间长了忘了,长大了有一天忽然听谁说起,又重回头脑,又默默体会了一遍,这跟模仿能力和创新能力似乎没什么关系。

Vyke(天雨),能否赐教如何分BiTree和BiTreeNode,我写的程序可能是BiTreeNode,另外你的第二个观点我有点看不懂,别怪我水平洼,而AVL树好像有点印象,不过我也不想再弄了,现在手头的事真的很多,不是学生了,没时间细细研究那么多了,sorry
Vyke 2004-04-24
  • 打赏
  • 举报
回复
粗略看了看,说说意见,错了可以指正:)(1).首先是设计上的问题,只用一个类就封装所有的东西,那样其实不是用oo的思想去编程,看起来很累赘。何不分成BiTree和BiTreeNode两个呢??所以本质上还是结构化编程。(2),是算法问题,遍历随便看了一下,大概没有问题,小问题我就不管了。主要是那个前序二叉树的建立,其实问题的描述可能就不太清楚,同一个序列的前序二叉树有很多,一个序列本身就是一颗退化的树,单纯要求建立前序二叉树而建立二叉树好像没有什么意义,这里的算法没有说错了,但是却是刚好是一个退化的线性树,那样和一个序列有什么区别??如果加一个条件就不同了,譬如是要求是一棵AVL树。至于算法在任何一本数据结构书里都可以找到。。呵呵,后面两个生成就没有看,留给楼下吧。
diaopeng 2004-04-22
  • 打赏
  • 举报
回复
其实数据结构的东西实用价值并不高,但是却对开发有很大的帮助,因为它影响了我们的思维,使得学过数据结构的程序员总在无意识的情况下使用了数据结构的设计思想。这就是高手与一般程序员的区别。
diaopeng 2004-04-22
  • 打赏
  • 举报
回复
呵呵~~~看完才写的出来,表示你的模仿能力挺强的,如果说到创新呢,就很差了。看了你的程序,感觉就是直接将C的二叉树实现用java重新写一遍,这有什么值得高兴的呢?
wang_zheng_wz 2004-04-22
  • 打赏
  • 举报
回复
那天去一家公司面试,人家让我根据一个前序字母序列画出二叉树,并且写出由前序序列字母和中序序列字母确定二叉树的算法,我当时没做出来,我已经很久没有看过数据结构了,学java到现在对数据结构似乎淡忘了,回来翻翻书,当天写了这个程序,于是松了一口气,看来东西还没全忘光。
虽然在那个公司最终面试结果还可以,但我没去那,因为和我现在的公司情况差不多,写了这个程序之后就没再看过它,它没什么实际意义,只当没写过吧。
flyingbug 2004-04-22
  • 打赏
  • 举报
回复
不知道楼主什么单位,还有时间写这个呢、、、、
thesecondbull 2004-04-20
  • 打赏
  • 举报
回复
喔,我是菜鸟
panpan221 2004-04-16
  • 打赏
  • 举报
回复
新手来学习,友情UP
nxct 2004-04-16
  • 打赏
  • 举报
回复
gz
runki 2004-04-15
  • 打赏
  • 举报
回复
不会帮你顶了
javacomte 2004-04-15
  • 打赏
  • 举报
回复
你在对树遍历时每进入一层就会创建一个StringBuffer,我想这么写比较好一点:

public String toStringByPreOrder() {
StringBuffer buff = new StringBuffer();
preOrder(buff);
}

private void preOrder(StringBuffer buff){
....
}
TIANHEI 2004-04-15
  • 打赏
  • 举报
回复
up
inflames 2004-04-11
  • 打赏
  • 举报
回复
好!
二叉树也可以用数组表示了。
filippo1980 2004-04-11
  • 打赏
  • 举报
回复
先看一下!up
wang_zheng_wz 2004-04-10
  • 打赏
  • 举报
回复
改了一下,去掉了toString里的null

import java.util.*;


public class BiTree {
private Object data;
private BiTree leftChild;
private BiTree rightChild;

public BiTree() {}

public BiTree(Object data) {
this.data = data;
}

public Object getData() {
return data;
}

public void setData(Object data) {
this.data = data;
}

public BiTree getLeftChild() {
return leftChild;
}

public void setLeftChild(BiTree bt) {
leftChild = bt;
}

public BiTree getRightChild() {
return rightChild;
}

public void setRightChild(BiTree bt) {
rightChild = bt;
}

// 先序二叉树字符串
public String toStringByPreOrder() {
StringBuffer result = new StringBuffer();
result.append(data);
result.append(" ");
if (leftChild != null) {
result.append(leftChild.toStringByPreOrder());
}
if (rightChild != null) {
result.append(rightChild.toStringByPreOrder());
}
return result.toString();
}

// 中序二叉树字符串
public String toStringByInOrder() {
StringBuffer result = new StringBuffer();
if (leftChild != null) {
result.append(leftChild.toStringByInOrder());
}
result.append(data);
result.append(" ");
if (rightChild != null) {
result.append(rightChild.toStringByInOrder());
}
return result.toString();
}

// 后序二叉树字符串
public String toStringByAfterOrder() {
StringBuffer result = new StringBuffer();
if (leftChild != null) {
result.append(leftChild.toStringByAfterOrder());
}
if (rightChild != null) {
result.append(rightChild.toStringByAfterOrder());
}
result.append(data);
result.append(" ");
return result.toString();
}

// 先序生成二叉树
public static BiTree createBiTreeByPreOrder(Iterator it) {
BiTree bt = null;
Object o = it.next();
if (o != null) {
bt = new BiTree(o);
bt.setLeftChild(createBiTreeByPreOrder(it));
bt.setRightChild(createBiTreeByPreOrder(it));
}
return bt;
}

// 中序生成二叉树
public static BiTree createBiTreeByInOrder(Iterator it) {
BiTree bt = null;
Object o = it.next();
if (o != null) {
bt = new BiTree();
bt.setLeftChild(createBiTreeByInOrder(it));
bt.setData(o);
bt.setRightChild(createBiTreeByInOrder(it));
}
return bt;
}

// 后序生成二叉树
public static BiTree createBiTreeByAfterOrder(Iterator it) {
BiTree bt = null;
Object o = it.next();
if (o != null) {
bt = new BiTree();
bt.setLeftChild(createBiTreeByAfterOrder(it));
bt.setRightChild(createBiTreeByAfterOrder(it));
bt.setData(o);
}
return bt;
}

public static void main(String[] args) {
System.out.println("-------------------- bt ---------------------");
BiTree bt = new BiTree("A");
bt.setLeftChild(new BiTree("B"));
bt.setRightChild(new BiTree("C"));
System.out.println("pre order : " + bt.toStringByPreOrder());
System.out.println("in order : " + bt.toStringByInOrder());
System.out.println("after order : " + bt.toStringByAfterOrder());

System.out.println("-------------------- bt2 ---------------------");
BiTree bt2 = null;
Object[] sequence = new Object[] {
"A", "B", "C", null, null, "D", "E", null, "G", null, null, "F", null, null, null };
List l = Arrays.asList(sequence);
System.out.println("sequence : " + l);

bt2 = createBiTreeByPreOrder(l.iterator());
System.out.println("pre order : " + bt2.toStringByPreOrder());

bt2 = createBiTreeByInOrder(l.iterator());
System.out.println("in order : " + bt2.toStringByInOrder());

bt2 = createBiTreeByAfterOrder(l.iterator());
System.out.println("after order : " + bt2.toStringByAfterOrder());
}
}

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧