日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用java设计一个二叉树类的结构,二叉树的基本结构以及java实现

發(fā)布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用java设计一个二叉树类的结构,二叉树的基本结构以及java实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、二叉樹的結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。