樹,還不好列印得.樹,這個東西非常重要.一定要搞懂.
首先,樹的深度未知,樹的子樹長度未知
然後,插入新結點後,樹就變形了,難道每次插入後,就必須得整個修改嗎?
樹的遞迴與非遞迴.
遞迴與非遞迴遍歷
其實差別就是遞迴,程式幫你壓了乙個棧
.因而非遞迴
,則只需要把程式幫你壓的棧寫出來
,那麼就是非遞迴了
.
多個當
與乙個當
,其實,很多程式,根本沒有必要多個當(巢狀)當
,多個(巢狀)當
其實就是乙個當,只要你邏輯安排好了,就是乙個當
.因為無窮*無窮==無窮
.他們沒啥區別.
樹的廣度優先與深度優先遍歷
.
廣度優先:最直接,最明白,
.將第一層壓入佇列.然後把挨個的將第一層的子加入佇列尾,然後挨個的出佇列.就遍歷了.(一層層的動作).
深度優先:好久沒看樹了,一時就會搞忘記
.想半天的左,根,右
.
就是遞迴方式的深度優先,確實不容易理解.
多個子的列印位置,及乙個子的列印位置.實際上如果二叉樹,只有乙個左樹或只有乙個右樹,與只有乙個樹是一樣的.沒必要再去區別左樹,右樹.這裡把二叉樹的子樹儲存為向量《節點*>
.而不是單獨的節點*左,右
.
樹的深度優先遞迴方式:
空 深先(節點*a,整 層)
//大致是這樣的吧.
感覺他最後的一段**,是比較簡單的,但我覺得,他前面一大堆是亂說.搞不懂在說什麼.
不過,後來仔細想想,深度優先與廣度優先其實是一樣的.樹嘛,都是樹.與那個html樹
有啥區別?
非遞迴深先就是自己加乙個遞迴深先的棧,自己把棧寫出來而已
.反正這個棧是必須寫的,跑不脫.
,說得多,都是錯,別人說了一大堆,結果沒搞懂,那就不要看了.折騰.
空 非遞迴深先(節點*a)
//遞迴展開與非遞迴展開是不一樣的.
//同樣,交換這兩句的順序,就變了,根->子,子->根,對了的
//像遞迴,是可以的.畢竟是在棧上.
//要變形的話,把重點句與上個句子,混在一起,想怎麼變,就怎麼變.
}
樹的列印還是難點,樹的完全樹(滿樹)這沒意義.太大的樹,你不可能全列印出來.
而且一旦有新的節點進入,還要相應調整.不可能進來乙個結點,調整整個樹吧.
樹
就是乙個同義複述
,模仿自己的變化.
把父節點與一堆子節點
看成乙個大節點
,先進入這個大節點,然後想怎麼變,怎麼變.
然後進入其中乙個子節點,再同樣的變化
.當然,剛才進的那個節點就必須要出來
了.有進有出,才有生意
.
教科書的寫法叫折騰:
空 左半邊(節點*p,向量《整》
&啊)}
//這是二叉樹,把這個當提出來,好理解些
空 先序(節點*r,向量《整》
&啊)//開始p為不含左結點的葉子結點,
//p->右,可能會是空針(即無右結點).
}//先訪問(本結點,左半邊,)然後訪問右結點.
}
上面是教科書折騰
.
空 深先(節點*a)
//愉快的玩耍了,媽媽再也不用擔心樹的遍歷了
}//所謂的深先,,其實只是乙個排列而已.樹的遍歷就是很多種.想怎麼遍歷,怎麼遍歷.我高興.
//深先與廣先,本質完全不一樣.廣先是按層次的,即按樹高的遍歷,
線段樹基礎(1)
訓練了三周線段樹,對線段樹的點操作 斷更新和常見應用範圍進行總結,並記錄一些技巧。線段樹是一種二叉搜尋樹,也是一顆平衡樹。樸素的遞迴寫法是對於每乙個非葉子節點 l,r 取m l r 2,左孩子為 l,m 右孩子為 m 1,r 使用堆式儲存,空間大小為4n。一些define define lc rt ...
golang學習demo1 目錄樹列印
涉及知識 因為用win10的tree工具的列印結果不是很滿意,比如執行tree f結果是這樣的 卷 fiveplus 的資料夾 path 列表 卷序列號為 5ebe 3da3 c ftree.exe hello.go pathnow.exe filetree files.exe files.go f...
樹的橫向列印 縱向列印
水平列印樹,選擇右中左遍歷的原因。右樹在根節點的上面,左樹在根節點的下面,按照從上到下的順序列印就是右中左的遍歷方式。def printtree root,depth 0 s if not root return s sright printtree2 root.right,depth 1 prin...