之前在了解二叉樹旋轉的時候,為了方便檢視中間狀態,就寫了個以樹狀形式列印二叉樹的函式。
起初是使用二叉樹中序遍歷的結果展開的方式,簡單但列印出來的樹有一定的傾斜。
例如這棵樹:
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,分別指向當前層的最右邊和下一層的最右邊節點。當當前層的最右邊節點從佇列中輸出時,表示這一層遍歷完畢了,此時使...