用java设计一个二叉树类的结构,二叉树的基本结构以及java实现
一、二叉樹的結(jié)構(gòu)
二叉樹是每個節(jié)點最多有兩個子樹的樹結(jié)構(gòu)
二、幾種類型的二叉樹
(1)
完全二叉樹——若設(shè)二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結(jié)點數(shù)都達(dá)到最大個數(shù),第h層有
葉子結(jié)點,并且葉子結(jié)點都是從左到右依次排布,這就是
完全二叉樹。
(2)
滿二叉樹——除了葉結(jié)點外每一個結(jié)點都有左右子葉且葉子結(jié)點都處在最底層的二叉樹。 (3)平衡二叉樹——平衡二叉樹又被稱為AVL樹(區(qū)別于AVL算法),它是一棵二叉排序樹,且具有以下性質(zhì):它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。
三、二叉樹的實現(xiàn)代碼
package javaTest;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
public class BinaryTree {
private int[] array={1,2,3,4,5,6,7,8,9};
private static List nodeList=null;
private static class Node{
public int data;
public Node leftChild;
public Node rightChild;
Node(int newDate){
data=newDate;
leftChild=null;
rightChild=null;
}
}
public void createBinTree(){
nodeList=new LinkedList();
//將數(shù)組轉(zhuǎn)換成Node組成的一個list
for(int nodeIndex = 0;nodeIndex
nodeList.add(new Node(array[nodeIndex]));
//System.out.println(array[nodeIndex]);
//System.out.println(nodeList.get(nodeIndex).data);
}
for(int i=0;i
nodeList.get(i).leftChild=nodeList.get(2*i+1);
nodeList.get(i).rightChild=nodeList.get(2*i+2);
}
int lastParentIndex=array.length/2-1;
nodeList.get(lastParentIndex).leftChild=nodeList.get(2*lastParentIndex+1);
if(array.length%2==1){
nodeList.get(lastParentIndex).rightChild=nodeList.get(2*lastParentIndex+2);
}
}
/**
* 先序遍歷
*
* 這三種不同的遍歷結(jié)構(gòu)都是一樣的,只是先后順序不一樣而已
*
* @param node
* 遍歷的節(jié)點
*/
public static void preOrderTraverse(Node node) {
if (node == null)
return;
System.out.print(node.data + " ");
preOrderTraverse(node.leftChild);
preOrderTraverse(node.rightChild);
}
public static void nrPreOrderTraverse(Node node){
Stack stack=new Stack();
while(node!=null||!stack.isEmpty()){
while(node!=null){
System.out.print(node.data+" ");
stack.push(node);
node=node.leftChild;
}
node=stack.pop();
node=node.rightChild;
}
}
/**
* 中序遍歷
*
* 這三種不同的遍歷結(jié)構(gòu)都是一樣的,只是先后順序不一樣而已
*
* @param node
* 遍歷的節(jié)點
*/
public static void inOrderTraverse(Node node) {
if (node == null)
return;
inOrderTraverse(node.leftChild);
System.out.print(node.data + " ");
inOrderTraverse(node.rightChild);
}
public static void nrInOrderTraverse(Node node){
Stack stack=new Stack();
while(node!=null||!stack.isEmpty()){
while(node!=null){
stack.push(node);
node=node.leftChild;
}
node=stack.pop();
System.out.print(node.data+" ");
node=node.rightChild;
}
}
/**
* 后序遍歷
*
* 這三種不同的遍歷結(jié)構(gòu)都是一樣的,只是先后順序不一樣而已
*
* @param node
* 遍歷的節(jié)點
*/
public static void postOrderTraverse(Node node) {
if (node == null)
return;
postOrderTraverse(node.leftChild);
postOrderTraverse(node.rightChild);
System.out.print(node.data + " ");
}
public static void nrPostOrderTraverse(Node node){
Stack stack=new Stack();
Node preNode = null;//表示最近一次訪問的節(jié)點
while(node!=null||!stack.isEmpty()){
while(node!=null){
stack.push(node);
node=node.leftChild;
}
node=stack.peek();
if(node.rightChild==null||node.rightChild==preNode){
System.out.print(node.data+" ");
node=stack.pop();
preNode=node;
node=null;
}else{
node=node.rightChild;
}
}
}
public static void main(String[] args) {
BinaryTree tree=new BinaryTree();
tree.createBinTree();
Node root=nodeList.get(0);
//System.out.println(root.data);
System.out.println("先序遍歷:");
preOrderTraverse(root);
System.out.println();
System.out.println("中序遍歷:");
inOrderTraverse(root);
System.out.println();
System.out.println("后序遍歷:");
postOrderTraverse(root);
System.out.println();
System.out.println("非遞歸中序遍歷:");
nrInOrderTraverse(root);
System.out.println();
System.out.println("非遞歸先序遍歷:");
nrPreOrderTraverse(root);
System.out.println();
System.out.println("非遞歸后序遍歷:");
nrPostOrderTraverse(root);
System.out.println();
}
}
總結(jié)
以上是生活随笔為你收集整理的用java设计一个二叉树类的结构,二叉树的基本结构以及java实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php encode 数组,PHP中js
- 下一篇: oracle date类型,oracl