import java.util.*;
public class BinaryTree {
static class Node{
Node left;
Node right;
int val;
public Node (int val,Node left, Node right) {
this.left = left;
this.right = right;
this.val = val;
}
}
public static void main(String args[]){
Node node9=new Node(9,null,null);
Node node2=new Node(2,null,null);
Node node1=new Node(1,null,null);
Node node6=new Node(6,node9,node2);
Node node4=new Node(4,node1,null);
Node root=new Node(5,node6,node4);
inOrder(root);
preOrder(root);
postOrder(root);
}
/**
* 先序
* @param root
*/
static void preOrder(Node root){
Stack<Node> stack=new Stack<>();
if(root==null) return ;
stack.push(root);
while(!stack.isEmpty()){
//先访问
Node node=stack.pop();
System.out.print(node.val+"\t");
if(node.right!=null) stack.push(node.right);//先将右子树入栈
if(node.left!=null) stack.push(node.left);//再将左子树入栈
}
System.out.println("");
}
static void inOrder(Node root){
Stack<Node> stack=new Stack<>();
Node currentNode=root;
if(root==null) return;
//入栈
stack.push(root);
while(!stack.isEmpty()){
while(currentNode.left!=null){
stack.push(currentNode.left);
currentNode=currentNode.left;
}
//访问第一个元素
currentNode=stack.pop();
System.out.print(currentNode.val+"\t");
if(currentNode.right!=null){
//入栈
stack.push(currentNode.right);
currentNode=currentNode.right;
}
}
System.out.println("");
}
/**
* 后序遍历 就是先序遍历 左右孩子的入栈顺序调换一下,再加一个辅助栈, stack1出来一个stack2进入一个,最后打印stacl2即可
* @param root
*/
static void postOrder(Node root){
if(root != null){
Stack<Node> s1 = new Stack<Node>();
Stack<Node> s2 = new Stack<Node>();
s1.push(root);
while(!s1.isEmpty()){
root = s1.pop();
s2.push(root);
if(root.left != null){
s1.push(root.left);
}
if(root.right != null){
s1.push(root.right);
}
}
}
System.out.println("");
}
}
二叉树三种遍历方式 非递归
最新推荐文章于 2024-04-11 01:39:56 发布
本文介绍了如何使用Java编程实现二叉树的先序(Pre-order)、中序(In-order)和后序(Post-order)遍历算法,通过栈的数据结构实现递归调用的替代,适合初学者理解基本的二叉树遍历概念。
摘要由CSDN通过智能技术生成