【遍历二叉树】-前序、中序、后序及层次遍历(java实现)
一、前中后序遍历
- 前中后序遍历是基于深度遍历(DFS)思想,一般用递归或者栈来实现
package binaryTree;
import java.util.Stack;
public class BinaryTreeSelect {
public static void main(String[] args) {
TreeNode[] node = new TreeNode[10];
for (int i = 0; i <10 ; i++) {
node[i] = new TreeNode(i);
}
for (int i = 0; i <10 ; i++) {
if (i*2+1<10)
node[i].left = node[i*2+1];
if (i*2+2<10)
node[i].right = node[i*2+2];
}
System.out.println("=========前序================");
preOrderRe(node[0]);
System.out.println();
preOrder(node[0]);
System.out.println();
System.out.println("=========中序================");
midOrderRe(node[0]);
System.out.println();
midOrder(node[0]);
System.out.println();
System.out.println("=========后序================");
postOrderRe(node[0]);
System.out.println();
postOrder(node[0]);
}
public static void preOrderRe(TreeNode tree){
System.out.print(tree.val);
TreeNode leftTree = tree.left;
if (leftTree != null)
preOrderRe(leftTree);
TreeNode rightTree = tree.right;
if (rightTree != null)
preOrderRe(rightTree);
}
public static void preOrder(TreeNode tree){
Stack<TreeNode> stack = new Stack<>();
while (tree!=null || !stack.isEmpty()){
while (tree!=null){
System.out.print(tree.val);
stack.push(tree);
tree = tree.left;
}
if (! stack.isEmpty()){
tree = stack.pop();
tree = tree.right;
}
}
}
public static void midOrderRe(TreeNode tree){
if (tree == null)
return;
else {
midOrderRe(tree.left);
System.out.print(tree.val);
midOrderRe(tree.right);
}
}
public static void midOrder(TreeNode tree){
Stack<TreeNode> stack = new Stack<>();
while (tree != null || !stack.isEmpty()){
while(tree != null){
stack.push(tree);
tree = tree.left;
}
if (!stack.isEmpty()){
tree = stack.pop();
System.out.print(tree.val);
tree = tree.right;
}
}
}
public static void postOrderRe(TreeNode tree){
if (tree == null){
return;
}
else{
postOrderRe(tree.left);
postOrderRe(tree.right);
System.out.print(tree.val);
}
}
public static void postOrder(TreeNode tree){
int left =1;
int right=2;
Stack<TreeNode> stack = new Stack<>();
Stack<Integer> stackAssist = new Stack<>();
while (tree != null || !stack.empty()){
while (tree != null){
stack.push(tree);
stackAssist.push(left);
tree=tree.left;
}
while (!stack.empty() && stackAssist.peek()==right){
stackAssist.pop();
System.out.print(stack.pop().val);
}
if (!stack.empty() && stackAssist.peek()==left){
stackAssist.pop();
stackAssist.push(right);
tree=stack.peek().right;
}
}
}
}
- 结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190902184905624.png)
二、层次遍历
- 层次遍历是基于广度优先遍历(BFS)思想,借助队列来实现
public static void levelOrder(TreeNode tree){
if (tree==null)
return;
LinkedList<TreeNode> list = new LinkedList<>();
list.add(tree);
TreeNode curNode;
while (!list.isEmpty()){
curNode = list.poll();
System.out.print(curNode.val);
if (curNode.left != null)
list.add(curNode.left);
if (curNode.right != null)
list.add(curNode.right);
}
}
- 结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190902190023386.png)