列印二叉樹

2022-10-11 16:06:10 字數 2213 閱讀 7424

之前在了解二叉樹旋轉的時候,為了方便檢視中間狀態,就寫了個以樹狀形式列印二叉樹的函式。

起初是使用二叉樹中序遍歷的結果展開的方式,簡單但列印出來的樹有一定的傾斜。

例如這棵樹:

5

3 7

2 6 8

它的中序遍歷結果為:

+++++++++++++

|2|3|5|6|7|8|

+++++++++++++

列印出來的結果中,節點 3 和節點 7 不是對稱的。因為節點 3 距離其父節點 5 的距離只有 1,而節點 7 距離其父節點 5 的距離則是 2。

於是做了一番改造,列印了對稱的樹:

5

3 7

2 6 8

對應的陣列是:

+++++++++++++++

|2|3| |5|6|7|8|

+++++++++++++++

這裡改成返回遍歷結果而不是直接列印。

// inorderiteration 中序遍歷迭代法

func inorderiteration(root *treenode) *treenode

root = stack[len(stack)-1]

stack = stack[:len(stack)-1]

root = root.right

} return rs

}

// printtree 以中序遍歷結果展開樹

func printtree(root *treenode)

inorder := inorderiteration(root)

row := *treenode

var cache *treenode

for len(row) != 0 else

}} fmt.println()

for _, node := range cache

if node.right != nil

} }}

借鑑中序遍歷展開的思路。根據樹的高度,申請乙個可以容納這個高度滿節點狀態的節點數量的陣列。從根節點開始,寬度優先遍歷。讓每個節點都把乙個範圍平均分成兩部分。

為了方便,這裡先展示具有破壞性的列印。破壞的地方為 node 的 height 屬性。在列印時,會發生變化。如果不想破壞,則再增加乙個 layer 屬性即可。

func printtree(root *treenode)  else 

} height--

fmt.println() }}

// updatehighttomax 前序遍歷更新高度,把子節點的高度更新為父節點高度-1

func updatehighttomax(root *treenode)

root = root.left

} node := stack[len(stack)-1]

stack = stack[:len(stack)-1]

root = node.right }}

// tostrictinorderarray 對稱的樹

func tostrictinorderarray(root *treenode) *treenode

// 總節點數為 (2^n)-1

result := make(*treenode, (1<0 else

result[idx] = iternode

} return result

}// breadthfirstiteration 廣度優先遍歷

func breadthfirstiteration(node *treenode) *treenode

for index := 0; index < len(data); index++

if node.right != nil

} return data

}// findindexstrictinorder 在陣列中找到指定節點的位置

func findindexstrictinorder(tree *treenode, node *treenode) int else if node.value > tree[middle].value else

} return middle

}

二叉樹列印

舉例 1.初始化時,last 1,把1放入佇列 2.將1出隊,把1的子孩子2,3放入佇列,更新nlast 3 3.nlast更新完之後,列印上一次出隊的1,並和last比較,如果相同就列印換行,並更新last nlast 3 4.將2出隊,把2的子孩子4放入佇列,更新nlast 4 5,nlast更...

二叉樹列印

給定一顆二叉樹的頭節點head,請按照現在大家看到的這種格式列印 要求列印成 12 主要解決的問題是 如何換行 last 表示正在列印的當前行的最右節點 從左至右遍歷,如果遍歷到last節點,說明該換行了,換行之後,只需要nlast last,繼續下一行的列印過程,一直重複,直到所有的節點都列印完。...

二叉樹問題 二叉樹層級列印

給定二叉樹的頭結點,按層級列印二叉樹節點值。從上到下按層遍歷,應該是先遍歷到的節點先輸出。因此用佇列作為輔助結構來解此題。層級遍歷中關鍵點要知道什麼時候換層。用兩個變數last 和nlast,分別指向當前層的最右邊和下一層的最右邊節點。當當前層的最右邊節點從佇列中輸出時,表示這一層遍歷完畢了,此時使...