• 最直接的構造方法:直接建立一個樹對象

    ?? 構造一個二叉樹

    class??tree??implements??java.io.Serializable???{?
    ?????
    public??tree?left;?
    ?????
    public??tree?right;?
    ?????
    public???int??id;?
    ?????
    public???int??level;?

    ?????
    private???static???int??count??=???0?;???????????

    ?????
    public??tree(?int??depth)???{???????????????????id??=??count?++?;?
    ????????level??
    =??depth;?
    ?????????
    if??(depth??>???0?)???{?
    ????????????left??
    =???new??tree(depth?-?1?);?
    ????????????right??
    =??new??tree(depth?-?1?);?
    ????????}
    ??
    ????}
    ??

    ?????
    public???void??print(?int??levels)???{?
    ?????????
    for??(?int??i??=???0?;?i??<??level;?i?++?)?
    ????????????System.out.print(?
    "????"?);?
    ????????System.out.println(?
    "?node??"???+??id);?

    ?????????
    if??(level??<=??levels??&&??left??!=???null?)?
    ????????????left.print(levels);?

    ?????????
    if??(level??<=??levels??&&??right??!=???null?)?
    ????????????right.print(levels);?
    ????}
    ??

?

?

  • 通過建造樹的節點構造一棵樹:

    葉子節點對象

    public?class?ResultItem?{????????????

    ?? ?private?String?name;
    ??
    private?String?value;
    ??
    /**
    ???*?父目錄
    ???
    */

    ??
    private?ResultFolder?parent?=?null;??????????? //父目錄節點ResultFolder?
    ??
    /**
    ???*?構造函數
    ???*?
    @param?sName?節點名稱
    ???
    */

    ??
    public?ResultItem(String?sName)?{
    ????name?
    =?sName;
    ??}

    ??
    /**
    ???*?獲取父目錄
    ???*?
    @return?父目錄
    ???
    */

    ??
    public?ResultFolder?getParent()?{
    ??????? ?
    return?parent;
    ??}

    ??
    /**
    ???*?設置父目錄
    ???*?
    @param?folder?父目錄
    ???
    */

    ??
    protected?void?setParent(ResultFolder?folder)?{
    ????parent?
    =?folder;
    ??}

    ??
    /**
    ???*?獲取節點名稱
    ???*?
    @return?節點名稱
    ???
    */

    ??
    public?String?getName()?{
    ????
    return?name;
    ??}

    ??
    /**
    ???*?獲取節點值
    ???*?
    @return?節點值
    ???
    */

    ??
    public?String?getValue()?{
    ????
    return?value;
    ??}

    ??
    /**
    ???*?設置節點值
    ???*?
    @param?newValue?節點值
    ???
    */

    ??
    public?void?setValue(String?newValue)?{
    ????value?
    =?newValue;
    ??}

    }

? 建造父目錄節點以及數的像關操作


public ? class ?ResultFolder? extends ?ResultItem {
??
/**
???*?字對象向量
???
*/

??
private ?Vector?vtItems? = ? new ?Vector();
??
/**
???*?構造函數
???*?
@param ?sName?參數名稱
???
*/

??
public ?ResultFolder(String?sName)? {
????
super (sName);
??}


??
/**
???*?設置內容
???*?
@param ?newValue?內容
???
*/

??
public ? void ?setValue(String?newValue)? {
????
// ?Can't?set?value?to?a?ResultFolder
????
// System.out.println("Can't?set?value?to?a?ResultFolder");
??}


??
/**
???*?獲取內容
???*?
@return ?內容
???
*/

??
public ?String?getValue()? {
????
// ?Can't?get?value?of?a?ResultFolder"
????
// System.out.println("Can't?get?value?of?a?ResultFolder");
???? return ? "" ;
??}

??
/**
???*?增加數據子項
???*?
@param ?item?子項
???
*/

??
public ? void ?appendChild(ResultItem?item)? {
????vtItems.addElement(item);
????item.setParent(
this );
??}


??
/**
???*?從結果樹中移去一個節點,不進行進行遍歷查找
???*?
@param ?item?節點
???*?
@return ?true-成功,flase-失敗
???
*/

??
public ? boolean ?removeChild(ResultItem?item)? {
????
return ?removeChild(item,? false );
??}


??
/**
???*?從結果樹中移去一個節點,進行遞歸查找
???*?
@param ?item??節點
???*?
@param ?bRecursive??true-遞歸查找,?false-不作遞歸查找
???*?
@return ?true-成功,?false-失敗
???
*/

??
public ? boolean ?removeChild(ResultItem?item,? boolean ?bRecursive)? {
????
if ( ! vtItems.removeElement(item)? && ?bRecursive)? {
??????
for ( int ?i = 0 ;?i < vtItems.size();?i ++ )? {
????????Object?o?
= ?vtItems.elementAt(i);
????????
if (?o? instanceof ?ResultFolder)? {
??????????(?(ResultFolder)?o).removeChild(item,?
true );
????????}

??????}

????}

????
return ? false ;
??}


??
/**
???*?遞歸查找具有指定值的ResultItem
???*?
@param ?sKey?名稱
???*?
@param ?bRecursive?是否遞歸查找
???*?
@return ?節點
???
*/

??
public ?ResultItem?findSingleItem(String?sKey,? boolean ?bRecursive)? {
????ResultItem?item?
= ? null ;
????
for ( int ?i = 0 ;?i < vtItems.size();?i ++ )? {
??????item?
= ?(ResultItem)vtItems.elementAt(i);
??????
if (item.getName().equalsIgnoreCase(sKey))? {
????????
return ?item;
??????}

??????
else ? if (bRecursive? && ?item? instanceof ?ResultFolder)? {
????????ResultItem?subItem?
= ?((ResultFolder)item).findSingleItem(sKey,? true );
????????
if (subItem? != ? null )? {
??????????
return ?subItem;
????????}

??????}

????}

????
return ? null ;
??}


??
/**
???*?遞歸查找具有指定值的ResultItem的值
???*?
@param ?sKey?名稱
???*?
@param ?bRecursive?是否遞歸查找
???*?
@return ?節點的值
???
*/

??
public ?String?findSingleValue(String?sKey,? boolean ?bRecursive)? {
????ResultItem?item?
= ?findSingleItem(sKey,?bRecursive);
????
if (item? != ? null )? {
??????
return ?item.getValue();
????}

????
return ? null ;
??}

??
/**
???*?非遞歸查找具有指定值的ResultItem的值
???*?
@param ?sKey?節點名稱
???*?
@return ?節點值
???
*/

??
public ?String?findSingleValue(String?sKey)? {
????
return ?findSingleValue(sKey,? false );
??}

??
/**
???*?找到關鍵字為特定值的Item列表
???*?
@param ?sKey?節點名稱
???*?
@return ??Item向量
???
*/

??
public ?Vector?findItems(String?sKey)? {
????Vector?vt?
= ? new ?Vector();
????
for ( int ?i = 0 ;?i < vtItems.size();?i ++ )? {
??????ResultItem?item?
= ?(ResultItem)vtItems.elementAt(i);
??????
if (item.getName().equalsIgnoreCase(sKey))? {
????????vt.addElement(item);
??????}

????}

????
return ?vt;
??}

??
/**
???*?找到關鍵字為特定值的Item
???*?
@param ?sKey?節點名稱
???*?
@return ??Item
???
*/

??
public ?ResultItem?findSingleItem(String?sKey)? {
????
for ( int ?i = 0 ;?i < vtItems.size();?i ++ )? {
??????ResultItem?item?
= ?(ResultItem)vtItems.elementAt(i);
??????
if (item.getName().equalsIgnoreCase(sKey))? {
????????
return ?item;
??????}

????}

????
return ? null ;
??}

??
/**
???*?追加子節點
???*?
@param ?key?子節點名稱
???*?
@param ?value?子節點值
???*?
@return ?子節點
???
*/

??
public ?ResultItem?appendChild(String?key,?String?value)? {
????ResultItem?item?
= ? new ?ResultItem(key);
????item.setValue(value);
????
this .appendChild(item);
????
return ?item;
??}

??
/**
???*?追加子目錄
???*?
@param ?key?名稱
???*?
@return ?子目錄
???
*/

??
public ?ResultFolder?appendChildFolder(String?key)? {
????ResultFolder?folder?
= ? new ?ResultFolder(key);
????
this .appendChild(folder);
????
return ?folder;
??}

??
/**
???*?獲取子項向量
???*?
@return ?子項向量
???
*/

??
public ?Vector?getChildItems()? {
????
return ?vtItems;
??}

??
/**
???*?非遞歸方式判斷是否含有指定子項
???*?
@param ?aValue?子項名稱
???*?
@return ?true-是,?false-否
???
*/

??
public ? boolean ?hasValue(String?aValue)? {
????
return ?hasValue(aValue,? false );
??}

??
/**
???*?判斷是否含有指定子項
???*?
@param ?aValue?子項名稱
???*?
@param ?bRecursive?是否以遞歸方式
???*?
@return ?true-是,?false-否
???
*/

??
public ? boolean ?hasValue(String?aValue,? boolean ?bRecursive)? {
????
for ( int ?i = 0 ;?i < vtItems.size();?i ++ )? {
??????ResultItem?item?
= ?(ResultItem)vtItems.elementAt(i);
??????
if (item.getValue().equals(aValue))? {
????????
return ? true ;
??????}

??????
else ? if (bRecursive? && ?(item? instanceof ?ResultFolder))? {
????????
boolean ?bOK? = ?((ResultFolder)item).hasValue(aValue,? true );
????????
if (bOK)
??????????
return ? true ;
??????}

????}

????
return ? false ;
??}

??
/**
???*?獲取Html安全代碼
???*?
@param ?key?原代碼
???*?
@return ?Html安全代碼
???
*/

??
public ?String?getValueByHtml(String?key)? {
????
return ?htmlEscape(findSingleValue(key));
??}


??
/**
???*?Html安全代碼轉換程序
???*?
@param ?xml?原代碼
???*?
@return ?Html安全代碼
???
*/

??
public ? static ?String?htmlEscape(String?xml)? {
????
if ?(xml? == ? null )? return ? null ;
????String?ret?
= ?xml;
????StringBuffer?sb?
= ? new ?StringBuffer();
????
// ?do?&?first
???? int ?p,?q;
????
for (q? = ?ret.indexOf( " & " ),?p? = ? 0 ;?q? >= ? 0 ;?p? = ? ++ q,?q? = ?ret.indexOf( " & " ,?p))? {
??????sb.append(ret.substring(p,?q));
??????sb.append(
" &amp; " );
????}

????sb.append(ret.substring(p));
????ret?
= ?sb.toString();
????sb?
= ? new ?StringBuffer();
????
// ?do?<
???? for (q? = ?ret.indexOf( " < " ),?p? = ? 0 ;?q? >= ? 0 ;?p? = ? ++ q,?q? = ?ret.indexOf( " < " ,?p))? {
??????sb.append(ret.substring(p,?q));
??????sb.append(
" &lt; " );
????}

????sb.append(ret.substring(p));
????ret?
= ?sb.toString();
????sb?
= ? new ?StringBuffer();
????
// ?do?>
???? for (q? = ?ret.indexOf( " > " ),?p? = ? 0 ;?q? >= ? 0 ;?p? = ? ++ q,?q? = ?ret.indexOf( " > " ,?p))? {
??????sb.append(ret.substring(p,?q));
??????sb.append(
" &gt; " );
????}

????sb.append(ret.substring(p));
????ret?
= ?sb.toString();
????sb?
= ? new ?StringBuffer();
????
// ?do?return
???? for (q? = ?ret.indexOf( " \n " ),?p? = ? 0 ;?q? >= ? 0 ;?p? = ? ++ q,?q? = ?ret.indexOf( " \n " ,?p))? {
??????sb.append(ret.substring(p,?q));
??????sb.append(
" <br> " );
????}

????sb.append(ret.substring(p));
????ret?
= ?sb.toString();
????
return ?ret;
??}

}