1.前序遍历
前序遍历(DLR,lchild,data,rchild),是二叉树遍历的一种,也叫做先根遍历、先序遍历、前序周游,可记做根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。
package bianli;
import java.util.Stack;
/**
* 前序遍历
*/
class TreeNode{
int value;
TreeNode left;
TreeNode right;
TreeNode(int value){
this.value = value;
}
}
public class Test1 {
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];
}
preOrder(node[0]);
}
public static void preOrderRe(TreeNode biTree) {
//递归实现
while(biTree != null) {
System.out.println(biTree.value);
preOrderRe(biTree.left);
preOrderRe(biTree.right);
}
}
public static void preOrder(TreeNode biTree) {
//非递归实现
Stack<TreeNode> stack = new Stack<>();
while(biTree != null || !stack.isEmpty()) {
if(biTree != null) {
System.out.println(biTree.value);
stack.push(biTree);
biTree = biTree.left;
}else {
biTree = stack.pop();
biTree = biTree.right;
}
}
}
}
2.中序遍历
中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,先左后根再右。巧记:左根右。
package bianli;
import java.util.Stack;
/**
* 中序遍历
*/
public class Test2 {
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];
}
}
midOrder(node[0]);
}
public static void midOrderRe(TreeNode biTree) {
if(biTree == null)
return;
else
{
midOrderRe(biTree.left);
System.out.println(biTree.value);
midOrderRe(biTree.right);
}
}
public static void midOrder(TreeNode biTree) {
Stack<TreeNode> stack = new Stack<>();
while(biTree != null || !stack.isEmpty()) {
while(biTree != null) {
stack.push(biTree);
biTree = biTree.left;
}
if(!stack.isEmpty()) {
biTree = stack.pop();
System.out.println(biTree.value);
biTree = biTree.right;
}
}
}
}