转自《Java程序员面试笔试宝典》(何昊等编著,机械工业出版社)
在排序二叉树中,左子树的数值都小于双亲结点的数值,右子树的数值都大于等于双亲结点的数值。每个子树也递归满足上述条件。
下面先给出了建立排序二叉树的算法,然后依次给出了先序、中序、后序和层序遍历二叉树的方法。
import java.util.Queue;
import java.util.LinkedList;
public class BinaryTree {
private Node root;
public BinaryTree(){
root = null;
}
//向二叉排序树插入数据,小于根结点的数插入左子树,大于等于根结点的数插入右子树
public void insert(int data){
Node current, parent;
Node n = new Node(data);
if(root == null){
root = n;
}else{
current = root;
while(true){//寻找插入位置
parent = current;
if(data < current.data){
current = current.left;
if(current == null){
parent.left = n;
return;
}
}else{
current = current.right;
if(current == null){
parent.right = n;
return;
}
}
}
}
}
public void buildBinaryTree(int[] data){
if(data != null && data.length > 0){
for(int i: data){
insert(i);
}
}
}
/*
* 中序遍历的递归实现
*/
public void inOrder(Node localroot){
if(localroot != null){
inOrder(localroot.left);
System.out.print(localroot.data + " ");
inOrder(localroot.right);
}
}
public void inOrder(){
inOrder(root);
}
//先序遍历的递归实现
public void preOrder(Node localroot){
if(localroot != null){
System.out.print(localroot.data + " ");
preOrder(localroot.left);
preOrder(localroot.right);
}
}
public void preOrder(){
preOrder(root);
}
//后序遍历的递归实现
public void postOrder(Node root){
if(root != null){
postOrder(root.left);
postOrder(root.right);
System.out.print(root.data + " ");
}
}
public void postOrder(){
postOrder(root);
}
//层序遍历
public void layerTransverse(){
if(root == null){
return;
}
Queue<Node> q = new LinkedList<>();
q.add(root);
Node n;
while(!q.isEmpty()){
n = q.poll();
System.out.print(n.data + " ");
if(n.left != null){
q.add(n.left);
}
if(n.right != null){
q.add(n.right);
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] data = {2,8,7,4,9,3,1,6,7,5};
BinaryTree bt = new BinaryTree();
bt.buildBinaryTree(data);
System.out.print("in order: ");
bt.inOrder();
System.out.println();
System.out.print("pre order: ");
bt.preOrder();
System.out.println();
System.out.print("post order: ");
bt.postOrder();
System.out.println();
System.out.print("layer transverse: ");
bt.layerTransverse();
}
}
class Node{
int data;
Node left , right;
public Node(){}
public Node(int data){
this.data = data;
left = null;
right = null;
}
}