java構(gòu)造二叉樹,可以通過鏈表來構(gòu)造,如下代碼:
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供漳平網(wǎng)站建設(shè)、漳平做網(wǎng)站、漳平網(wǎng)站設(shè)計、漳平網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、漳平企業(yè)網(wǎng)站模板建站服務(wù),10余年漳平做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
public?class?BinTree?{
public?final?static?int?MAX=40;
BinTree?[]elements?=?new?BinTree[MAX];//層次遍歷時保存各個節(jié)點
int?front;//層次遍歷時隊首
int?rear;//層次遍歷時隊尾
private?Object?data;?//數(shù)據(jù)元數(shù)
private?BinTree?left,right;?//指向左,右孩子結(jié)點的鏈
public?BinTree()
{
}
public?BinTree(Object?data)
{?//構(gòu)造有值結(jié)點
this.data?=?data;
left?=?right?=?null;
}
public?BinTree(Object?data,BinTree?left,BinTree?right)
{?//構(gòu)造有值結(jié)點
this.data?=?data;
this.left?=?left;
this.right?=?right;
}
public?String?toString()
{
return?data.toString();
}
//前序遍歷二叉樹
public?static?void?preOrder(BinTree?parent){?
if(parent?==?null)
return;
System.out.print(parent.data+"?");
preOrder(parent.left);
preOrder(parent.right);
}
//中序遍歷二叉樹
public?void?inOrder(BinTree?parent){
if(parent?==?null)
return;
inOrder(parent.left);
System.out.print(parent.data+"?");
inOrder(parent.right);
}
//后序遍歷二叉樹
public?void?postOrder(BinTree?parent){
if(parent?==?null)
return;
postOrder(parent.left);
postOrder(parent.right);
System.out.print(parent.data+"?");
}
//?層次遍歷二叉樹?
public?void?LayerOrder(BinTree?parent)
{?
elements[0]=parent;
front=0;rear=1;
while(frontrear)
{
try
{
if(elements[front].data!=null)
{
System.out.print(elements[front].data?+?"?");
if(elements[front].left!=null)
elements[rear++]=elements[front].left;
if(elements[front].right!=null)
elements[rear++]=elements[front].right;
front++;
}
}catch(Exception?e){break;}
}
}
//返回樹的葉節(jié)點個數(shù)
public?int?leaves()
{
if(this?==?null)
return?0;
if(left?==?nullright?==?null)
return?1;
return?(left?==?null???0?:?left.leaves())+(right?==?null???0?:?right.leaves());
}
//結(jié)果返回樹的高度
public?int?height()
{
int?heightOfTree;
if(this?==?null)
return?-1;
int?leftHeight?=?(left?==?null???0?:?left.height());
int?rightHeight?=?(right?==?null???0?:?right.height());
heightOfTree?=?leftHeightrightHeight?rightHeight:leftHeight;
return?1?+?heightOfTree;
}
//如果對象不在樹中,結(jié)果返回-1;否則結(jié)果返回該對象在樹中所處的層次,規(guī)定根節(jié)點為第一層
public?int?level(Object?object)
{
int?levelInTree;
if(this?==?null)
return?-1;
if(object?==?data)
return?1;//規(guī)定根節(jié)點為第一層
int?leftLevel?=?(left?==?null?-1:left.level(object));
int?rightLevel?=?(right?==?null?-1:right.level(object));
if(leftLevel0rightLevel0)
return?-1;
levelInTree?=?leftLevelrightLevel?rightLevel:leftLevel;
return?1+levelInTree;
}
//將樹中的每個節(jié)點的孩子對換位置
public?void?reflect()
{
if(this?==?null)
return;
if(left?!=?null)
left.reflect();
if(right?!=?null)
right.reflect();
BinTree?temp?=?left;
left?=?right;
right?=?temp;
}
//?將樹中的所有節(jié)點移走,并輸出移走的節(jié)點
public?void?defoliate()
{
if(this?==?null)
return;
//若本節(jié)點是葉節(jié)點,則將其移走
if(left==nullright?==?null)
{
System.out.print(this?+?"?");
data?=?null;
return;
}
//移走左子樹若其存在
if(left!=null){
left.defoliate();
left?=?null;
}
//移走本節(jié)點,放在中間表示中跟移走...
String?innerNode?+=?this?+?"?";
data?=?null;
//移走右子樹若其存在
if(right!=null){
right.defoliate();
right?=?null;
}
}
/**
*?@param?args
*/
public?static?void?main(String[]?args)?{
//?TODO?Auto-generated?method?stub
BinTree?e?=?new?BinTree("E");
BinTree?g?=?new?BinTree("G");
BinTree?h?=?new?BinTree("H");
BinTree?i?=?new?BinTree("I");
BinTree?d?=?new?BinTree("D",null,g);
BinTree?f?=?new?BinTree("F",h,i);
BinTree?b?=?new?BinTree("B",d,e);
BinTree?c?=?new?BinTree("C",f,null);
BinTree?tree?=?new?BinTree("A",b,c);
System.out.println("前序遍歷二叉樹結(jié)果:?");
tree.preOrder(tree);
System.out.println();
System.out.println("中序遍歷二叉樹結(jié)果:?");
tree.inOrder(tree);
System.out.println();
System.out.println("后序遍歷二叉樹結(jié)果:?");
tree.postOrder(tree);
System.out.println();
System.out.println("層次遍歷二叉樹結(jié)果:?");
tree.LayerOrder(tree);
System.out.println();
System.out.println("F所在的層次:?"+tree.level("F"));
System.out.println("這棵二叉樹的高度:?"+tree.height());
System.out.println("--------------------------------------");
tree.reflect();
System.out.println("交換每個節(jié)點的孩子節(jié)點后......");
System.out.println("前序遍歷二叉樹結(jié)果:?");
tree.preOrder(tree);
System.out.println();
System.out.println("中序遍歷二叉樹結(jié)果:?");
tree.inOrder(tree);
System.out.println();
System.out.println("后序遍歷二叉樹結(jié)果:?");
tree.postOrder(tree);
System.out.println();
System.out.println("層次遍歷二叉樹結(jié)果:?");
tree.LayerOrder(tree);
System.out.println();
System.out.println("F所在的層次:?"+tree.level("F"));
System.out.println("這棵二叉樹的高度:?"+tree.height());
}
import java.util.LinkedList;/**
* 需求:按層打印一棵樹
* 說明:樹是保存在一個鏈表中
* created by wangjunfu on 2017-05-25. */
public class TreeNode {
String data;
TreeNode parent;
LinkedListTreeNode childlist;
TreeNode() {
data = null;
childlist = new LinkedList();
parent = null;
} //遞歸顯示并打印一棵樹
private static void displayTree(TreeNode f, int level) {
String preStr = ""; // 打印前綴
for (int i = 0; i level; i++) {
preStr += " ";
} for (int i = 0; i f.childlist.size(); i++) {
TreeNode t = f.childlist.get(i);
System.out.println(preStr + "-" + t.data); if (!t.childlist.isEmpty()) {
displayTree(t, level + 1);
}
}
}
}
//偽代碼。我文本框里直接寫的
void dfs(treeNodeT a)
{
iteretor itr=a.children();
while (itr.hasNext())
{
dfs((treeNode)itr.next());//遞歸調(diào)用
}
}
就是這樣了。每次迭代的查詢子節(jié)點,
如果子節(jié)點還有子節(jié)點就繼續(xù)向下找,一直找到最深。
直到?jīng)]有了就彈棧,看看上一級還有沒有其他的子節(jié)點。
有就遍歷他的第二個子節(jié)點,沒有就彈。
這樣的話就是深度優(yōu)先搜索了。
import?java.awt.*;
import?javax.swing.*;
class?TreeDemo?extends?JFrame
{
public?TreeDemo()
{
setSize(400,300);
setTitle("演示怎樣使用JTree");
show();
JScrollPane?jPanel=new?JScrollPane();
getContentPane().add(jPanel);
JTree?jtree=new?JTree();
jPanel.getViewport().add(jtree,null);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
public?class?Example5_25
{
public?static?void?main(String[]?args)
{
TreeDemo?frame=new?TreeDemo();
}
}
其中JScrollPane是一個帶滾動條的面板類。
將對象加入到帶滾動條的面板類中,在將已建的數(shù)放入到其中。
就可建立一個系統(tǒng)默認(rèn)的樹結(jié)構(gòu)。
按照你的要求加詳細(xì)注釋的圣誕樹Java程序如下:(編程思想在注釋中說明)
public?class?ShengDanShu2?{
//這個程序的編程思想是利用對for循環(huán)變量i的控制達(dá)到一層循環(huán)代替雙層循環(huán)的目的
public?static?void?main(String[]?args)?{????
int???n=5;???//初始化打印圣誕樹層數(shù)變量n
int???a=0;???//初始化打印前置空格數(shù)變量a
int???b=0;???//初始化打印星號數(shù)變量b
for(int?i=1;i?=n;i++){???//打印n層圣誕樹
if(a!=(n-i)){????//如果前置空格數(shù)不等于n-i
System.out.print("?");?//打印一個空格
a++;????//前置空格數(shù)加一???
i=i-1;????//i變量減一??目的是固定住i變量不變直到a==n-i
}else?if(b!=(2*i-1)){???//如果星號數(shù)不等于2*i-1
System.out.print("*");??//打印一個星號
b++;????//星號數(shù)加一
i=i-1;???//i變量減一??目的是固定住i變量不變直到b==2*i-1
}else?if(a==(n-i)??b==(2*i-1)){//當(dāng)以上兩個條件都滿足時,換行初始化a和b為0???
System.out.println();??//打印換行?
a=0;???//對新的一行重新初始化前置空格數(shù)變量a
b=0;??//對新的一行重新初始化打印星號數(shù)變量b
//這里沒有控制for循環(huán)的i變量減一,因為這時i變量加一,開始新一行。
}???
}???
}?????
}
運行結(jié)果:
*
***
*****
*******
*********
打印 * 號的時候不要用println,用print就行了
println是打印后換行,print則是直接打印