二叉树的遍历主要有三种方式,根据二叉树的根节点的位置分别为前序遍历,中序遍历和后序遍历。
前序遍历的规则是:根节点,左子树,右子树;首先访问根节点,根节点处理完往左子树走,直到左子树为空再访问右子树。
中序遍历的规则是:左子树,根节点,右子树;沿着左子树一直往下访问,直到左子树为空回退到父节点,再往右子树一直往下访问,如果右子树也访问完了就回退到上层的左节点,再重复左中右的顺序遍历。
后序遍历的规则是:左子树,右子树,根节点。与前序遍历相反,先遍历完左右子树再处理根节点。
代码如下:
package 树的遍历;
import java.io.*;
/*===================== 二叉树节点类的声明 =======================*/
class TreeNode{
int value;
TreeNode left_Node ,right_Node;
public TreeNode(int value){ //TreeNode构造放法。
this.value = value;
this.left_Node = null;
this.right_Node = null;
}
}
/*===================== 二叉树类声明 =======================*/
class BinaryTree{
public TreeNode rootNode; //声明树结点。
public void Add_Node_To_Tree(int value){
if(rootNode==null){
rootNode = new TreeNode(value);
return; //return的作用是结束方法的后续操作?神奇了!
} //如果树结点为空,将初值加到根节点。
TreeNode currentNode = rootNode; //将根节点的值给当前节点。
while(true){ //如果节点值为真(大于0)
System.out.print(value+"+"+currentNode.value+" "); //检验一下是否符合自己的猜想。
if(value<currentNode.value){ //当前值小于当前节点的值,在左子树。
if(currentNode.left_Node==null){
currentNode.left_Node = new TreeNode(value); //当前节点左子节点为空,将值赋给其左节点。
return;
}
else currentNode = currentNode.left_Node ; //当前节点左子节点不为空,将引用赋给其左节点(即将左子节点作为当前节点,继续 下一步操作.)
}
else{
if(currentNode.right_Node==null){ //当前值大于等于当前节点的值,在右子树。
currentNode.right_Node = new TreeNode(value);
return;
}
else currentNode = currentNode.right_Node;
}
}
}
/*===================== 中序遍历的方法 =======================*/
public void InOrder(TreeNode node){ //递归实现遍历。
if(node!=null){
InOrder(node.left_Node); //回调自己,继续判断左子节点是否为空,如果为空,就返回当前节点的值。
System.out.print("["+node.value+"]");
InOrder(node.right_Node);
}
}
/*===================== 前序遍历的方法 =======================*/
public void PreOrder(TreeNode node){
if(node!=null){
System.out.print("["+node.value+"]");
PreOrder(node.left_Node);
PreOrder(node.right_Node);
}
}
/*===================== 后序遍历的方法 =======================*/
public void PostOrder(TreeNode node){
if(node!=null){
PostOrder(node.left_Node);
PostOrder(node.right_Node);
System.out.print("["+node.value+"]");
}
}
}
/*===================== 检验结果 =======================*/
public class demobianli {
public static void main(String args[])throws IOException{
int i;
int arr[] = {7,4,1,5,16,8,11,12,15,9,2}; //原始数组。
BinaryTree tree = new BinaryTree(); //声明树对象。
System.out.print("数组原始内容:\n");
for(i = 0;i<arr.length;i++){
System.out.print("["+arr[i]+"]");} //输出数组内容。
System.out.println();
for(i = 0;i<arr.length;i++) tree.Add_Node_To_Tree(arr[i]); //将数组中的值传递给建立二叉树的方法。
System.out.print("[二叉树的内容]\n");
System.out.print("前序遍历结果:\n");
tree.PreOrder(tree.rootNode); //调用前序遍历的方法,按前序遍历输出二叉树序列。
System.out.println();
System.out.print("中序遍历结果:\n"); //中序。
tree.InOrder(tree.rootNode);
System.out.println();
System.out.print("后序遍历结果:\n");
tree.PostOrder(tree.rootNode); //后序。
}
}