二叉树的遍历

二叉树的遍历主要有三种方式,根据二叉树的根节点的位置分别为前序遍历,中序遍历和后序遍历。
前序遍历的规则是:根节点,左子树,右子树;首先访问根节点,根节点处理完往左子树走,直到左子树为空再访问右子树。
中序遍历的规则是:左子树,根节点,右子树;沿着左子树一直往下访问,直到左子树为空回退到父节点,再往右子树一直往下访问,如果右子树也访问完了就回退到上层的左节点,再重复左中右的顺序遍历。
后序遍历的规则是:左子树,右子树,根节点。与前序遍历相反,先遍历完左右子树再处理根节点。

代码如下:

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);                  //后序。
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值