2018.4.27 尝试用 Java 实现二叉树
import java.util.Queue ;
import java.util.Scanner ;
import java.util.LinkedList ;
// 定义一个外部的类
class Node {
private int data ;
public Node [] ch = new Node[2] ;
// ch[0] 左孩子, ch[1] 右孩子
public Node () {
data = 0 ;
ch[0] = ch[1] = null ;
}
// 构造函数重载
public Node ( final int data , Node l , Node r ) {
this.data = data ;
this.ch[0] = l ;
this.ch[1] = r ;
}
// 主键值比根更小, 搜索左子树 ; 更大, 搜索右子树
public int cmp ( final int data ) {
return data < this.data ? 0 : data == this.data ? -1 : 1 ;
}
// 返回主键值
public int get_data () {
return data ;
}
}
// 定义文件类名
public class Binary_Tree_2 {
// main 函数入口
public static void main ( String[] args ) {
Binary_Tree_2 One = new Binary_Tree_2 () ;
System.out.print ( "\n前序遍历 : " ) ;
One.pre_Visit ( One.Root ) ;
System.out.print ( "\n\n中序遍历 : " ) ;
One.mid_Visit ( One.Root ) ;
System.out.print ( "\n\n后序遍历 : " ) ;
One.post_Visit ( One.Root ) ;
System.out.print ( "\n\n层次遍历 : \n\n" ) ;
One.level_visit () ; // 无法从静态上下文中引用非静态
System.out.print ( "二叉树的高度是 : " + One.get_height ( One.Root ) + "\n\n" ) ;
}
// 定义一个二叉树的根
private Node Root = null ;
// 二叉树的构造函数, 初始化, 我插入了一个序列
public Binary_Tree_2 () {
int [] arr = new int [] { 12 , 5 , 3 , 20 , 9 , 7 , 11 , 4 , 2 , 1 } ;
for ( int i = 0 ; i < arr.length ; ++i )
Root = insert ( Root , arr[i] ) ;
}
// 递归插入, 不允许插入已经存在的值
public Node insert ( Node root , final int x ) {
if ( root == null ) {
root = new Node ( x , null , null ) ; return root ;
}
int d = root.cmp ( x ) ;
if ( d != -1 )
root.ch[d] = insert ( root.ch[d] , x ) ;
return root ;
}
// 前序遍历
public void pre_Visit ( Node root ) {
if ( root == null ) return ;
System.out.print ( root.get_data () + " " ) ;
if ( root.ch[0] != null ) pre_Visit ( root.ch[0] ) ;
if ( root.ch[1] != null ) pre_Visit ( root.ch[1] ) ;
}
// 中序遍历
public void mid_Visit ( Node root ) {
if ( root == null ) return ;
if ( root.ch[0] != null ) mid_Visit ( root.ch[0] ) ;
System.out.print ( root.get_data () + " " ) ;
if ( root.ch[1] != null ) mid_Visit ( root.ch[1] ) ;
}
// 后序遍历
public void post_Visit ( Node root ) {
if ( root == null ) return ;
if ( root.ch[0] != null ) post_Visit ( root.ch[0] ) ;
if ( root.ch[1] != null ) post_Visit ( root.ch[1] ) ;
System.out.print ( root.get_data () + " " ) ;
}
// 用 Queue 来实现队列
public void level_visit () {
if ( Root == null ) return ;
Queue < Node > Q = new LinkedList < Node > () ;
Q.offer ( Root ) ;
while ( Q.size () != 0 ) {
Node cur = Q.poll () ;
System.out.print ( cur.get_data () ) ;
if ( cur.ch[0] != null ) {
System.out.print ( "\tlchild : " + cur.ch[0].get_data () ) ;
Q.offer ( cur.ch[0] ) ;
} else {
System.out.print ( "\tlchild : null" ) ;
}
if ( cur.ch[1] != null ) {
System.out.print ( "\t\trchild : " + cur.ch[1].get_data () ) ;
Q.offer ( cur.ch[1] ) ;
} else {
System.out.print ( "\t\trchild : null" ) ;
}
System.out.print ( "\n\n" ) ;
}
}
// 递归求树的高度
public int get_height ( Node root ) {
if ( root == null ) return 0 ;
return Math.max ( get_height ( root.ch[0] ) , get_height ( root.ch[1] ) ) + 1 ;
}
}
程序结果:
本人刚学 Java, 如果在类的封装,函数使用,等等上有什么弊病,请路过的朋友多提些意见