樹代表的是層級關係,一對多的關係。
二叉樹是穩定的結構,並且孩子兄弟法是一種用二叉樹的結構來描述任何形狀樹的方法。所以二叉樹是最常使用的樹結構。
樹最常用的情況就是,
1.表示現實中的層級關係,
2.採用樹這種天然分叉的儲存結構來降低搜尋成本,如左大右小,把線性結構搜尋的n週期。立馬減少到log2。
3.0和1編碼以及二叉樹來完成字首編碼。 並在字首編碼的基礎上,發現了最小樹的一種簡便建立方法,hefuman樹來進行非等概離資料的壓縮。
總結:
樹的遍歷,是遞迴的概念。乙個樹由頂點,左樹,右樹構成。 而左樹和右樹也是同樣是樹,一層層遞減,當樹成為了乙個葉子時候,而沒有左右節點的時候就成了基本問題
樹還是有複習的價值。可以複習下遞迴。 find 這個方法中說明乙個問題遞迴要先認真做好分治,使得原問題等於小問題的組合,
並且體現遞迴思路的,最好別合併。沒有十分清楚這句話是什麼意思的話,一定要去看一下find方法第三行。
package com.linson.datastrcture;////
public
class mybinarytree
public
t element;
public mybinarynodeleftnode;
public mybinarynoderightnode;
}public
mybinarytree()
public
mybinarytree(t _element)
//add
public mybinarynodeinsert(mybinarynodefathernode,boolean isleft,t _value)
else
result=tempnode;}}
return
result;
}//delete
public
void
clear()
//find
public mybinarynodefind(t _value)
//問題組合:找頂點,找左樹,找右樹。 最小規模:找頂點。如果是體現思路的**就不要合併了。比如這裡體現遞迴思路的,最好別合併。
private mybinarynodefind(mybinarynodenode,t _value)
}else
//小一規模遞迴來組合。
else}}
//寫的什麼鬼,結果導向來寫的**,雖然執行正確,但是思路根本沒清晰。
//if(node.element.equals(_value))
////
else
////}}
return
result;
}//type:0:first print parent node .1 left children ,parent, right children. 2:left children ,right children parent.
public
void printtree(int
type)
//列印樹:組合:列印左樹,列印節點,列印右樹。基本情況:葉子。
private
void printtree(mybinarynodenode,int
type)
if(type==0
)
else
//非基本操作,需要遞迴來組合成原問題
if(node.rightnode!=null
) }}
else
if(type==1
)
else
system.
out.println(node.element.tostring());
if(node.rightnode!=null
) }}
else
else
if(node.rightnode!=null
)
system.
out.println(node.element.tostring());}}
}public mybinarynoderootnode=null
;}
通用樹的兄弟孩子結構,也是一種二叉樹
package com.datastructurn;//應該是樹應用最廣的結構。
//public
class childbrother
public
string tostring()
}public childbrothernoderoot=null
;
public
childbrother(t item)
//add
public childbrothernodeadd(childbrothernodenode,boolean ischild,t value)
else
if((!ischild && node.brother==null
))
return
ret;
}//remove
public
boolean remove(t value)
else
ret=null
; result=true
; }
return
result;
}//modify,find & modify
//find
public childbrothernodefind(t _value,childbrothernoderootnode)
else
if(ret==null && rootnode.child!=null
)
}return
ret;
}public childbrothernodegetrealfather(childbrothernoderootnode)
}tempchecknode=tempchecknode.father;}}
return
ret;
}public
int getreallevel (childbrothernodenode)
return
ret;
}//type:0:first print parent node .1 left children ,parent, right children. 2:left children ,right children parent.
public
void printtree(int
type)
private
void printnodes(childbrothernodenode,int
type,string temp)
if(node.brother!=null
)
}else
if(type==1
)
system.
out.println(temp+node.tostring());
if(node.brother!=null
)
}else
if(node.brother!=null
)
system.
out.println(temp+node.tostring());}}
//update 2 node? myfater and my little brother?
}
資料結構之二叉樹
在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...
資料結構之二叉樹
定義 滿足以下條件的就是樹 1.有且僅有乙個特定的稱為根root的結點。2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是乙個棵樹,並稱為根的子樹。樹是資料結構中一種常見的資料結構,比如我們排序中常見的二叉樹,紅黑樹等。最常見的是樹形表示法和廣義表表示法。樹的結構示意...
資料結構之二叉樹
來看一下樹的結構 class treenode public treenode string value 首先,為了方便後面看到效果,先手動初始化乙個有4個節點的二叉樹 tree tree new tree treenode root new treenode root treenode node1...