java 树 先序遍历_树的遍历--先序/中序/后序--递归/非递归--java

import java.lang.reflect.AnnotatedElement;

import java.util.ArrayList;

import java.util.List;

import javax.swing.border.EmptyBorder;

public class main8 {

public static class TreeNode {

int val;

TreeNode left;

TreeNode right;

TreeNode(int x) { val = x; }

}

//递归方式

//先序遍历

public static void preordertravel(TreeNode node)

{

if(node==null)

return;

System.out.print(node.val+" ");

preordertravel(node.left);

preordertravel(node.right);

}

//中序遍历

public static void middletravel(TreeNode node)

{

if(node==null)

return;

middletravel(node.left);

System.out.print(node.val+" ");

middletravel(node.right);

}

//后序遍历

public static void behindtravel(TreeNode node)

{

if(node==null)

return;

behindtravel(node.left);

behindtravel(node.right);

System.out.print(node.val+" ");

}

//非递归方式

//先序遍历

//规则:(1)先把头结点放入栈

//(2)对于新放入栈的节点,出栈并输出,并依次放入右节点,左节点

//(3)重复(2)操作,直至栈为空

public static void preordersort2(TreeNode node)

{

List nodes=new ArrayList();

nodes.add(node);

while(nodes.size()!=0)

{

TreeNode treeNode=nodes.get(nodes.size()-1);

System.out.print(treeNode.val+" ");

nodes.remove(nodes.size()-1);

if(treeNode.right!=null)

{

nodes.add(treeNode.right);

}

if(treeNode.left!=null)

{

nodes.add(treeNode.left);

}

}

System.out.println();

}

//中序遍历

// 规则:

//(1) 把头结点放入

//(2)对于每一个新放入的节点都把它的左节点放入

//(3)当没有左节点要放入时,就出栈并输出栈顶的节点 并把它的右节点放入 然后对于该节点执行(2)

public static void middlesort2(TreeNode node)

{

List nodes=new ArrayList();

nodes.add(node);

int n=0;

while(nodes.size()!=0)

{

TreeNode treeNode=nodes.get(nodes.size()-1);

if(treeNode.left!=null&&n==0)

{

nodes.add(treeNode.left);

}

else {

System.out.print(treeNode.val+" ");

nodes.remove(nodes.size()-1);

n=1;//注意必须有新右节点放入时才能 继续 放栈顶的左节点

if(treeNode.right!=null)

{

nodes.add(treeNode.right);

n=0;

}

}

}

System.out.println();

}

// 后序遍历

//规则:

//(1)把头结点放入栈 1

//(2)对于新放入的节点,出栈并放入栈2,在栈1中分别按顺序放入它的左节点和右节点

//(3)重复步骤2,直至栈1为空

// (4)输出栈2的元素

public static void behindordersort2(TreeNode node)

{

List nodes1=new ArrayList();

List nodes2=new ArrayList();

nodes1.add(node);

while(nodes1.size()!=0)

{

TreeNode treeNode=nodes1.get(nodes1.size()-1);

nodes2.add(treeNode);

nodes1.remove(nodes1.size()-1);

if(treeNode.left!=null)

{

nodes1.add(treeNode.left);

}

if(treeNode.right!=null)

{

nodes2.add(treeNode.right);

}

}

while(nodes2.size()!=0)

{

System.out.print(nodes2.get(nodes2.size()-1).val+" ");

nodes2.remove(nodes2.size()-1);

}

System.out.println();

}

// 非递归方式

//层次遍历

//(1)向队列中放入头节点

//(2)出队一个元素,并将它的左节点和右节点进队

//(3)重复(2)操作,直至队列为空

public static void leveltravel(TreeNode node)

{

List nodes=new ArrayList();

nodes.add(node);

while(nodes.size()!=0)

{

TreeNode treeNode=nodes.get(0);

System.out.print(treeNode.val+" ");

nodes.remove(0);

if(treeNode.left!=null)

nodes.add(treeNode.left);

if(treeNode.right!=null)

nodes.add(treeNode.right);

}

System.out.println();

}

public static void main(String[] args) {

// TODO Auto-generated method stub

TreeNode aNode=new TreeNode(1);

TreeNode bNode=new TreeNode(2);

TreeNode cNode=new TreeNode(3);

TreeNode dNode=new TreeNode(4);

TreeNode eNode=new TreeNode(5);

aNode.left=bNode;

aNode.right=cNode;

bNode.left=dNode;

bNode.right=eNode;

System.out.println("递归方式:");

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

preordertravel(aNode);

System.out.println();

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

middletravel(aNode);

System.out.println();

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

behindtravel(aNode);

System.out.println();

System.out.println("非递归方式:");

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

preordersort2(aNode);

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

middlesort2(aNode);

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

behindordersort2(aNode);

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

leveltravel(aNode);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值