「后序遍历java」后序遍历是怎么遍历的

博主:adminadmin 2023-01-20 04:03:08 398

本篇文章给大家谈谈后序遍历java,以及后序遍历是怎么遍历的对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

在java中,遍历是干嘛用的?有什么意义?

你说的比较笼统,遍历的话,可以遍历数组,遍历list,遍历链表,遍历图,树等等,遍历的意义就在于检查集合中的元素并做处理。至于什么顺序,那要根据需求喽。

例子,比较简单的是,遍历一个整型数组,找出里面最大的数。

Java数据结构疑问

数据结构好几年了,都忘了,只能解决两问题。

第一个问题:

前序遍历的话,是先根节点,后是左右节点。

中序遍历是先左节点,后是根节点,最后是右节点。

前序遍历a是第一个,所以整个二叉树的根节点是a;

所以中序遍历的a节点前的节点(dgb)都是二叉树的左子树的节点,a后的节点(echf)为右子树的节点;

前序遍历是,左子树的顺序是:bdg,则b肯定是左子树的根节点,即为a的左节点;

左子树剩下dg节点,由于中序遍历时dg节点在b前,所以dg节点肯定是b节点的左子树节点,又因为不管是前序遍历还是中序遍历,顺序都是dg,所以d是b的左节点,g是d的右节点。

右子树的节点(echf),前序(cefh)时c在最前,所以c是a的右节点,中序(echf)在c前的节点为c的左子树节点,只有e,所以e为c的左节点;

只剩下hf节点,前序(fh)和中序(hf)顺序不一致,则只能是如图所示结果。

如图所示,后序遍历(遍历顺序,左子树,右子树,根)的顺序为:gdbehfca

问题四:

E1最后出的,说明E1一直在栈中,E2第一个出的,则E2是进入栈后就出来,此时容量至少是2;

E4第二个出的,说明E3进入栈后没有直接出来直到E4进入栈并出来之后,E3才出来,此时容量至少是3;

随后出来的是E6,则说明E5进入栈后也没直接出来,也是E6出来才轮到E5,此时容量至少也是3。

所以答案是3。

java Map 怎么遍历

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

我想要找一份关于java数据结构二叉树的实例详解(所有基本操作,包括二叉树的高度和节点总数)

#includestdio.h

#includestring.h

#includestdlib.h

#define Max 20 //结点的最大个数

typedef struct node{

char data;

struct node *lchild,*rchild;

}BinTNode; //自定义二叉树的结点类型

typedef BinTNode *BinTree; //定义二叉树的指针

int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数

//基于先序遍历算法创建二叉树

//要求输入先序序列,其中加入虚结点"#"以示空指针的位置

BinTree CreatBinTree(void){

BinTree T;

char ch;

if((ch=getchar())=='#')

return(NULL); //读入#,返回空指针

else{

T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点

T-data=ch;

T-lchild=CreatBinTree(); //构造左子树

T-rchild=CreatBinTree(); //构造右子树

return(T);

}

}

//先序遍历

void Preorder(BinTree T){

if(T){

printf("%c",T-data); //访问结点

Preorder(T-lchild); //先序遍历左子树

Preorder(T-rchild); //先序遍历右子树

}

}

//中序遍历

void Inorder(BinTree T){

if(T){

Inorder(T-lchild); //中序遍历左子树

printf("%c",T-data); //访问结点

Inorder(T-rchild); //中序遍历右子树

}

}

//后序遍历

void Postorder(BinTree T){

if(T){

Postorder(T-lchild); //后序遍历左子树

Postorder(T-rchild); //后序遍历右子树

printf("%c",T-data); //访问结点

}

}

//采用后序遍历求二叉树的深度、结点数及叶子数的递归算法

int TreeDepth(BinTree T){

int hl,hr,max;

if(T){

hl=TreeDepth(T-lchild); //求左深度

hr=TreeDepth(T-rchild); //求右深度

max=hlhr? hl:hr; //取左右深度的最大值

NodeNum=NodeNum+1; //求结点数

if(hl==0hr==0) leaf=leaf+1; //若左右深度为0,即为叶子。

return(max+1);

}

else return(0);

}

//主函数

void main(){

BinTree root;

int i,depth;

printf("\n");

printf("Creat Bin_Tree; Input preorder:"); //输入完全二叉树的先序序列,

// 用#代表虚结点,如ABD###CE##F##

root=CreatBinTree(); //创建二叉树,返回根结点

do{ //从菜单中选择遍历方式,输入序号。

printf("\t********** select ************\n");

printf("\t1: Preorder Traversal\n");

printf("\t2: Iorder Traversal\n");

printf("\t3: Postorder traversal\n");

printf("\t4: PostTreeDepth,Node number,Leaf number\n");

printf("\t0: Exit\n");

printf("\t*******************************\n");

scanf("%d",i); //输入菜单序号(0-4)

switch (i){

case 1: printf("Print Bin_tree Preorder: ");

Preorder(root); //先序遍历

break;

case 2: printf("Print Bin_Tree Inorder: ");

Inorder(root); //中序遍历

break;

case 3: printf("Print Bin_Tree Postorder: ");

Postorder(root); //后序遍历

break;

case 4: depth=TreeDepth(root); //求树的深度及叶子数

printf("BinTree Depth=%d BinTree Node number=%d",depth,NodeNum);

printf(" BinTree Leaf number=%d",leaf);

break;

case 5: printf("LevePrint Bin_Tree: ");

Levelorder(root); //按层次遍历

break;

default: exit(1);

}

printf("\n");

}while(i!=0);

}

//按层遍历

Levelorder( BinTNode *root){

BinTNode * q[Max]; //定义BinTNode类型的队列 用于存放节点 队列长最大为20个元素

int front=0,rear=0; //初始化队列为空

BinTNode *p; //临时节点指针

if(root!=NULL){ //将根节点进队

rear=(rear+1)%Max;

q[rear]=root;

}

while(front!=rear){

front=(front+1)%Max;

p=q[front]; //删除队首的元素 让两个节点(左右节点)孤立

printf("%c",p-data); //输出队列首元素的值

if(p-left!=null){ //如果存在左孩子节点,则左孩子节点进入队列

rear=(rear+1)%Max;

q[rear]=p-left;

}

if(p-right!=null){ //如果存在右孩子节点,则右孩子节点进入队列

rear=(rear+1)%Max;

q[rear]=p-right;

}

}

}

写一个java层次遍历二叉树,简单点就可以,我要的是代码,不是纯文字说明

public class BinaryNode {

Object element;

BinaryNode left;

BinaryNode right;

}

import java.util.*;

public class Queue {

protected LinkedList list;

// Postcondition: this Queue object has been initialized.

public Queue() {

list = new LinkedList();

} // default constructor

// Postcondition: the number of elements in this Queue object has been

// returned.

public int size() {

return list.size();

} // method size

// Postcondition: true has been returned if this Queue object has no

// elements. Otherwise, false has been returned.

public boolean isEmpty() {

return list.isEmpty();

} // method isEmpty

// Postconditon: A copy of element has been inserted at the back of this

// Queue object. The averageTime (n) is constant and

// worstTime (n) is O (n).

public void enqueue(Object element) {

list.addLast(element);

} // method enqueue

// Precondition: this Queue object is not empty. Otherwise,

// NoSuchElementException will be thrown.

// Postcondition: The element that was at the front of this Queue object -

// just before this method was called -- has been removed

// from this Queue object and returned.

public Object dequeue() {

return list.removeFirst();

} // method dequeue

// Precondition: this Queue object is not empty. Otherwise,

// NoSuchElementException will be thrown.

// Postcondition: the element at index 0 in this Queue object has been

// returned.

public Object front() {

return list.getFirst();

} // method front

} // Queue class

import java.io.IOException;

public class BinaryTree {

BinaryNode root;

public BinaryTree() {

super();

// TODO 自动生成构造函数存根

root=this.createPre();

}

public BinaryNode createPre()

//按照先序遍历的输入方法,建立二叉树

{

BinaryNode t=null;

char ch;

try {

ch = (char)System.in.read();

if(ch==' ')

t=null;

else

{

t=new BinaryNode();

t.element=(Object)ch;

t.left=createPre();

t.right=createPre();

}

} catch (IOException e) {

// TODO 自动生成 catch 块

e.printStackTrace();

}

return t;

}

public void inOrder()

{

this.inOrder(root);

}

public void inOrder(BinaryNode t)

//中序遍历二叉树

{

if(t!=null)

{

inOrder(t.left);

System.out.print(t.element);

inOrder(t.right);

}

}

public void postOrder()

{

this.postOrder(root);

}

public void postOrder(BinaryNode t)

//后序遍历二叉树

{

if(t!=null)

{

postOrder(t.left);

System.out.print(t.element);

postOrder(t.right);

}

}

public void preOrder()

{

this.preOrder(root);

}

public void preOrder(BinaryNode t)

//前序遍历二叉树

{

if(t!=null)

{

System.out.print(t.element);

preOrder(t.left);

preOrder(t.right);

}

}

public void breadthFirst()

{

Queue treeQueue=new Queue();

BinaryNode p;

if(root!=null)

treeQueue.enqueue(root);

while(!treeQueue.isEmpty())

{

System.out.print(((BinaryNode)(treeQueue.front())).element);

p=(BinaryNode)treeQueue.dequeue();

if(p.left!=null)

treeQueue.enqueue(p.left);

if(p.right!=null)

treeQueue.enqueue(p.right);

}

}

}

public class BinaryTreeTest {

/**

* @param args

*/

public static void main(String[] args) {

// TODO 自动生成方法存根

BinaryTree tree = new BinaryTree();

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

tree.preOrder();

System.out.println();

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

tree.inOrder();

System.out.println();

System.out.println("后序遍历:");

tree.postOrder();

System.out.println();

System.out.println("层次遍历:");

tree.breadthFirst();

System.out.println();

}

}

怎么用Java编写简单的程序,遍历c盘里所有的文件

这个可以使用递归来实现,具体代码如下:

import java.io.File;

public class Demo {

public static void main(String[] args) {

File file = new File("C:\\");// 指定文件目录

method(file);

}

public static void method(File file) {

File[] fs = file.listFiles();// 得到File数组

if(fs!=null) {// 判断fs是否为null

for(File f : fs) {

if(f.isFile()) {// 如果是文件直接输出

System.out.println(f.getName());

} else {

method(f);// 否则递归调用

}

}

}

}

}

后序遍历java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于后序遍历是怎么遍历的、后序遍历java的信息别忘了在本站进行查找喔。