qidao123.com技术社区-IT企服评测·应用市场

标题: 层序遍历重建二叉树,绘制二叉树图片 [打印本页]

作者: 农妇山泉一亩田    时间: 2025-4-28 13:00
标题: 层序遍历重建二叉树,绘制二叉树图片
在力扣刷二叉树相关题目时,输入一般都是完全层序遍历,我习惯在自己电脑上调试代码,因此才编写下面代码将完全层序遍历数据重建二叉树对象。
生成的结果二叉树一般也只会给出完全层序遍历,无法直观的感受二叉树现真相况,因此我编写代码将二叉树对象生成svg图片,刷二叉树相关题目更清晰直观了。
力扣原题:https://leetcode.cn/problems/w6cpku/ ,效果图如下:

代码如下:
  1. package main
  2. import (
  3.         "fmt"
  4.         "math"
  5.         "os"
  6.         "strconv"
  7.         "strings"
  8. )
  9. type TreeNode struct {
  10.         Val   int
  11.         Left  *TreeNode
  12.         Right *TreeNode
  13. }
  14. // 根据完全层序遍历构建二叉树
  15. func buildTree(s string) *TreeNode {
  16.         nums := strings.Split(strings.ReplaceAll(s, " ", ""), ",")
  17.         if len(nums) == 0 {
  18.                 return nil
  19.         }
  20.         n, err := strconv.Atoi(nums[0])
  21.         if err != nil {
  22.                 return nil
  23.         }
  24.         var (
  25.                 root  = &TreeNode{Val: n}
  26.                 queue = []*TreeNode{root}
  27.                 i     = 1
  28.         )
  29.         for i < len(nums) {
  30.                 node := queue[0]
  31.                 queue = queue[1:]
  32.                 if n, err = strconv.Atoi(nums[i]); err == nil {
  33.                         node.Left = &TreeNode{Val: n}
  34.                         queue = append(queue, node.Left)
  35.                 }
  36.                 i++
  37.                 if i < len(nums) {
  38.                         if n, err = strconv.Atoi(nums[i]); err == nil {
  39.                                 node.Right = &TreeNode{Val: n}
  40.                                 queue = append(queue, node.Right)
  41.                         }
  42.                 }
  43.                 i++
  44.         }
  45.         return root
  46. }
  47. // 生成完全层序遍历
  48. func levelOrder(root *TreeNode) string {
  49.         if root == nil {
  50.                 return ""
  51.         }
  52.         var (
  53.                 result strings.Builder
  54.                 queue  = []*TreeNode{root}
  55.         )
  56.         for len(queue) != 0 {
  57.                 node := queue[0]
  58.                 queue = queue[1:]
  59.                 if node == nil {
  60.                         result.WriteString("null,")
  61.                 } else {
  62.                         result.WriteString(strconv.Itoa(node.Val))
  63.                         result.WriteByte(',')
  64.                         queue = append(queue, node.Left)
  65.                         queue = append(queue, node.Right)
  66.                 }
  67.         }
  68.         return strings.TrimRightFunc(result.String(), func(r rune) bool {
  69.                 return r == 'n' || r == 'u' || r == 'l' || r == ','
  70.         })
  71. }
  72. // 生成二叉树的SVG图片
  73. func generateSVG(root *TreeNode) string {
  74.         var treeHeight func(*TreeNode) int
  75.         treeHeight = func(root *TreeNode) int {
  76.                 if root == nil {
  77.                         return 0
  78.                 }
  79.                 return max(treeHeight(root.Left), treeHeight(root.Right)) + 1
  80.         }
  81.         var (
  82.                 height = treeHeight(root)
  83.                 width  = int(math.Pow(2, float64(height))) * 50
  84.                 draw func(node *TreeNode, x, y, level int)
  85.                 svg = &strings.Builder{}
  86.         )
  87.         fmt.Fprintf(svg, `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 %d %d">`, width, height*100)
  88.         draw = func(node *TreeNode, x, y, level int) {
  89.                 if node == nil {
  90.                         return
  91.                 }
  92.                 nextLevel := level + 1
  93.                 offset := int(math.Pow(2, float64(height-nextLevel-1))) * 50
  94.                 if node.Left != nil {
  95.                         leftX := x - offset
  96.                         leftY := y + 100
  97.                         fmt.Fprintf(svg, `<line x1="%d" y1="%d" x2="%d" y2="%d" stroke="black" stroke-width="2" />`, x, y, leftX, leftY)
  98.                         draw(node.Left, leftX, leftY, nextLevel)
  99.                 }
  100.                 if node.Right != nil {
  101.                         rightX := x + offset
  102.                         rightY := y + 100
  103.                         fmt.Fprintf(svg, `<line x1="%d" y1="%d" x2="%d" y2="%d" stroke="black" stroke-width="2" />`, x, y, rightX, rightY)
  104.                         draw(node.Right, rightX, rightY, nextLevel)
  105.                 }
  106.                 fmt.Fprintf(svg, `<circle cx="%d" cy="%d" r="20" fill="lightblue" />`, x, y)
  107.                 fmt.Fprintf(svg, `<text x="%d" y="%d" text-anchor="middle" dominant-baseline="middle">%d</text>`, x, y, node.Val)
  108.         }
  109.         draw(root, width/2, 50, 0)
  110.         svg.WriteString(`</svg>`)
  111.         return svg.String()
  112. }
  113. func main() {
  114.         root := buildTree("4,1,6,0,2,5,7,null,null,null,3,null,null,null,8")
  115.         svg := generateSVG(root)
  116.         err := os.WriteFile("binary_tree.svg", []byte(svg), 0666)
  117.         if err != nil {
  118.                 fmt.Println("Error writing to file:", err)
  119.                 return
  120.         }
  121.         fmt.Println("SVG file created successfully!")
  122. }
复制代码
出处:https://www.cnblogs.com/janbar本文版权归作者和博客园所有,欢迎转载,转载请标明出处。喜欢我的文章请[关注我]吧。假如您觉得本篇博文对您有所劳绩,可点击[推荐][收藏]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4