列印樹1基礎

2021-09-28 12:39:00 字數 2038 閱讀 9889

樹,還不好列印得.樹,這個東西非常重要.一定要搞懂.

首先,樹的深度未知,樹的子樹長度未知

然後,插入新結點後,樹就變形了,難道每次插入後,就必須得整個修改嗎?

樹的遞迴與非遞迴.

遞迴與非遞迴遍歷其實差別就是遞迴,程式幫你壓了乙個棧.因而非遞迴,則只需要把程式幫你壓的棧寫出來,那麼就是非遞迴了.

多個當乙個當,其實,很多程式,根本沒有必要多個當(巢狀)當,多個(巢狀)當其實就是乙個當,只要你邏輯安排好了,就是乙個.因為無窮*無窮==無窮.他們沒啥區別.

樹的廣度優先與深度優先遍歷.

廣度優先:最直接,最明白,.將第一層壓入佇列.然後把挨個的將第一層的子加入佇列尾,然後挨個的出佇列.就遍歷了.(一層層的動作).

深度優先:好久沒看樹了,一時就會搞忘記.想半天的左,根,右.

就是遞迴方式的深度優先,確實不容易理解.

多個子的列印位置,及乙個子的列印位置.實際上如果二叉樹,只有乙個左樹或只有乙個右樹,與只有乙個樹是一樣的.沒必要再去區別左樹,右樹.這裡把二叉樹的子樹儲存為向量《節點*>.而不是單獨的節點*左,右.

樹的深度優先遞迴方式:

空 深先(節點*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...