Java如何理解preOrder()的实现

Python021

Java如何理解preOrder()的实现,第1张

这个不是很难理解哈,就是使用递归来遍历树,LZ请看:

首先,这个preOrder这个方法是用来遍历树的,貌似说了个废话,它需要一个

BinaryNode<E>p的参数,这个参数就是树上的一个节点。

首先,假如当前p是A,那么判断p是否为null,也就是是否有这个节点,如果有,那么打印p.data,应该是p的信息。

然后再次调用这个preOrder遍历树的方法preOrder(p.left);preOrder(p.right),但这此传入的节点已经不是A了,而是p.left和p.right,也就是B和C,然后依然跟上面一样,先判断是否有该节点,如果有就打印节点信息,然后再次调用该方法传入自己的左右孩子节点,一次递归循环,自己的左右孩子为null的时候,当然不会走if语句里面的内容,递归也就自然结束了

希望可以帮到LZ

java Map 遍历一般有四种方式

方式一: 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。

方式二: 在for-each循环中遍历keys或values。

如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。

该方法比entrySet遍历在性能上稍好(快了10%),而且代码更加干净。

方式三:使用Iterator遍历

使用泛型:

不使用泛型:

你也可以在keySet和values上应用同样的方法。

方法四:  通过键找值遍历(效率低)

作为方法一的替代,这个代码看上去更加干净;但实际上它相当慢且无效率。

因为从键取值是耗时的操作(与方法一相比,在不同的Map实现中该方法慢了20%~200%)。如果安装了FindBugs,它会做出检查并警告你关于哪些是低效率的遍历。所以尽量避免使用。

总结:

如果仅需要键(keys)或值(values)使用方法二。

如果所使用的语言版本低于java 5,或是打算在遍历时删除entries,必须使用方法三。

否则使用方法一(键值都要)。

扩展资料:

类似的遍历算法:

二叉树的遍历算法

1、先(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴ 访问根结点;

⑵ 遍历左子树

⑶ 遍历右子树。

2、中(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵访问根结点;

⑶遍历右子树。

3、后(根)序遍历得递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵遍历右子树;

⑶访问根结点。

参考资料:百度百科——Java

测试类:

package tree

import java.util.*

public class Test {

public static void main(String[] args){

List<Tree>trees=new ArrayList<Tree>()

int id=1

Tree tree1=new Tree(0,id++,"张三丰")

Tree tree2=new Tree(tree1.getId(),id++,"武当宋大侠宋远桥")

Tree tree3=new Tree(tree1.getId(),id++,"武当俞二侠俞莲舟")

Tree tree4=new Tree(tree1.getId(),id++,"武当俞三侠俞岱岩")

Tree tree5=new Tree(tree1.getId(),id++,"武当张四侠张松溪")

Tree tree6=new Tree(tree1.getId(),id++,"武当张五侠张翠山")

Tree tree7=new Tree(tree1.getId(),id++,"武当殷六侠殷梨亭")

Tree tree8=new Tree(tree1.getId(),id++,"武当莫七侠莫声谷")

Tree tree9=new Tree(tree6.getId(),id++,"明教张无忌")

Tree tree13=new Tree(tree2.getId(),id++,"叛徒宋青书")

Tree tree10=new Tree(0,id++,"任我行")

Tree tree11=new Tree(tree10.getId(),id++,"令狐冲")

Tree tree12=new Tree(tree10.getId(),id++,"任盈盈")

trees.add(tree1)

trees.add(tree2)

trees.add(tree3)

trees.add(tree4)

trees.add(tree5)

trees.add(tree6)

trees.add(tree7)

trees.add(tree8)

trees.add(tree9)

trees.add(tree10)

trees.add(tree11)

trees.add(tree12)

trees.add(tree13)

for(int i=0i<trees.size()i++){

Tree tree=trees.get(i)

if(tree.getParentId()==0){

tree.showChildTree(trees)

}

}

}

}

树类:

package tree

import java.util.List

public class Tree {

private int parentId

private int id

private String showStr

private String Spaces=""

public Tree() {

// TODO Auto-generated constructor stub

}

public Tree(int parentId,int id,String showStr){

this.parentId=parentId

this.id=id

this.showStr=showStr

}

public void showChildTree(List<Tree>trees){

if(parentId!=0){

trees.get(id-1).setSpaces(trees.get(parentId-1).getSpaces()+" ")

}

System.out.println(trees.get(id-1).getSpaces()+showStr)

for(int i=0i<trees.size()i++){

Tree tree=trees.get(i)

if(tree.getParentId()==id){

tree.showChildTree(trees)

}

}

}

public int getParentId() {

return parentId

}

public void setParentId(int parentId) {

this.parentId = parentId

}

public int getId() {

return id

}

public void setId(int id) {

this.id = id

}

public String getShowStr() {

return showStr

}

public void setShowStr(String showStr) {

this.showStr = showStr

}

public String getSpaces() {

return Spaces

}

public void setSpaces(String spaces) {

Spaces = spaces

}

}

控制台效果图:

张三丰

武当宋大侠宋远桥

叛徒宋青书

武当俞二侠俞莲舟

武当俞三侠俞岱岩

武当张四侠张松溪

武当张五侠张翠山

明教张无忌

武当殷六侠殷梨亭

武当莫七侠莫声谷

任我行

令狐冲

任盈盈