//類(lèi)Node定義二叉樹(shù)結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu);
為恩陽(yáng)等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及恩陽(yáng)網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、恩陽(yáng)網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
//一個(gè)結(jié)點(diǎn)應(yīng)包含結(jié)點(diǎn)值,左子結(jié)點(diǎn)的引用和右子結(jié)點(diǎn)的引用
class Node{
public Node left; //左子結(jié)點(diǎn)
public Node right; //右子結(jié)點(diǎn)
public int value; //結(jié)點(diǎn)值
public Node(int val){
value = val;
}
}
public class Traversal
{
//read()方法將按照前序遍歷的方式遍歷輸出二叉樹(shù)的結(jié)點(diǎn)值
//此處采用遞歸算法會(huì)比較簡(jiǎn)單,也容易理解,當(dāng)然也可以用
//循環(huán)的方法遍歷,但會(huì)比較復(fù)雜,也比較難懂。二叉樹(shù)遍歷
//用遞歸算法最為簡(jiǎn)單,因?yàn)槊總€(gè)結(jié)點(diǎn)的遍歷方式都是,根,
//左,右,遞歸的調(diào)用可以讓每個(gè)結(jié)點(diǎn)以這種方式遍歷
public static void read(Node node){
if(node != null){
System.out.println(node.value);//輸出當(dāng)前結(jié)點(diǎn)的值
if(node.left != null)
read(node.left); //遞歸調(diào)用 先讀左結(jié)點(diǎn)
if(node.right != null)
read(node.right); //遞歸調(diào)用 后讀右結(jié)點(diǎn)
}
}
public static void main(String[] args){
//初始化5個(gè)結(jié)點(diǎn),分別初始值為1,2,3,4,5
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
Node n5 = new Node(5);
//構(gòu)建二叉樹(shù),以n1為根結(jié)點(diǎn)
n1.left = n2;
n1.right = n5;
n2.left = n3;
n2.right = n4;
read(n1);
}
}
注釋和代碼都是我自己寫(xiě)的,如果樓主覺(jué)得有的注釋多余可以自己刪除一些!代碼我都編譯通過(guò),并且運(yùn)行結(jié)果如你提的要求一樣!你只要把代碼復(fù)制編譯就可以了,注意要以文件名Traversal.java來(lái)保存,否則編譯不通過(guò),因?yàn)閙ain函數(shù)所在的類(lèi)是public類(lèi)型的!
做了很多年的程序員,覺(jué)得什么樹(shù)的設(shè)計(jì)并不是非常實(shí)用。二叉樹(shù)有順序存儲(chǔ),當(dāng)一個(gè)insert大量同時(shí)順序自增插入的時(shí)候,樹(shù)就會(huì)失去平衡。樹(shù)的一方為了不讓塌陷,會(huì)增大樹(shù)的高度。性能會(huì)非常不好。以上是題外話。分析需求在寫(xiě)代碼。
import java.util.List;
import java.util.LinkedList;
public class Bintrees {
private int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
private static ListNode nodeList = null;
private static class Node {
Node leftChild;
Node rightChild;
int data;
Node(int newData) {
leftChild = null;
rightChild = null;
data = newData;
}
}
// 創(chuàng)建二叉樹(shù)
public void createBintree() {
nodeList = new LinkedListNode();
// 將數(shù)組的值轉(zhuǎn)換為node
for (int nodeIndex = 0; nodeIndex array.length; nodeIndex++) {
nodeList.add(new Node(array[nodeIndex]));
}
// 對(duì)除最后一個(gè)父節(jié)點(diǎn)按照父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的數(shù)字關(guān)系建立二叉樹(shù)
for (int parentIndex = 0; parentIndex array.length / 2 - 1; parentIndex++) {
nodeList.get(parentIndex).leftChild = nodeList.get(parentIndex * 2 + 1);
nodeList.get(parentIndex).rightChild = nodeList.get(parentIndex * 2 + 2);
}
// 最后一個(gè)父節(jié)點(diǎn)
int lastParentIndex = array.length / 2 - 1;
// 左孩子
nodeList.get(lastParentIndex).leftChild = nodeList.get(lastParentIndex * 2 + 1);
// 如果為奇數(shù),建立右孩子
if (array.length % 2 == 1) {
nodeList.get(lastParentIndex).rightChild = nodeList.get(lastParentIndex * 2 + 2);
}
}
// 前序遍歷
public static void preOrderTraverse(Node node) {
if (node == null) {
return;
}
System.out.print(node.data + " ");
preOrderTraverse(node.leftChild);
preOrderTraverse(node.rightChild);
}
// 中序遍歷
public static void inOrderTraverse(Node node) {
if (node == null) {
return;
}
inOrderTraverse(node.leftChild);
System.out.print(node.data + " ");
inOrderTraverse(node.rightChild);
}
// 后序遍歷
public static void postOrderTraverse(Node node) {
if (node == null) {
return;
}
postOrderTraverse(node.leftChild);
postOrderTraverse(node.rightChild);
System.out.print(node.data + " ");
}
public static void main(String[] args) {
Bintrees binTree = new Bintrees();
binTree.createBintree();
Node root = nodeList.get(0);
System.out.println("前序遍歷:");
preOrderTraverse(root);
System.out.println();
System.out.println("中序遍歷:");
inOrderTraverse(root);
System.out.println();
System.out.println("后序遍歷:");
postOrderTraverse(root);
}
}
從鍵盤(pán)接受輸入(先序),以二叉鏈表作為存儲(chǔ)結(jié)構(gòu),建立二叉樹(shù)(以先序來(lái)建立)
結(jié)果不是唯一