網站首頁 編程語言 正文
介紹
這道題是這樣的,有一個二叉樹,讓求出這顆Bt樹里面最大的寬度是有幾個節點,同時還要求出最大寬度的這些節點在第幾層?
比如:下面這顆樹,它每層最大的寬度是3,所在的層數是在第3層
流程
- 這個題主要是使用隊列的方式來存儲需要遍歷的節點
- 同時還需要幾個變量來存儲最大的寬度(maxWidth)、每層有幾個節點(count)、最大寬度所在的層(maxInrow)、當前層最后一個節點(currentRowEndNode)、下一層最后一個節點(nextRowEndNode)
- 程序的一開始,便將二叉樹的頭節點加入到隊列里面,同時將這個節點賦值給下一層最后一個節點因當根節點只有一個節點,同時也將當前行的最后一個節點賦值為這個節點
- 通過循環來對這個隊列進行遍歷,當進入循環后就認為走到了一個節點,count就要加1
- 將隊列里面的節點元素開始彈出,如果它的子節點存在就將子節點賦值給nextRowEndNode,先賦值左再賦值右(因為先處理的是左子節點),同時將這倆個節點加入到隊列里面(如果它們存在的話)
- 還要對當前的節點進行一個判斷,判斷當前的節點是不是到了當前行的最后一個節點,如果是的話,就代表當前行的數據已經處理完成,就要把nextRowEndNode賦值給currentRowEndNode,count置0
- 進行下一波循環
代碼
二叉樹結構體
type TreeNode struct { val string left *TreeNode right *TreeNode }
測試代碼
func main() { sNode := &TreeNode{val: "1"} sNode.left = &TreeNode{val: "2"} sNode.right = &TreeNode{val: "3"} sNode.left.left = &TreeNode{val: "4"} sNode.left.right = &TreeNode{val: "5"} sNode.right.left = &TreeNode{val: "6"} sNode.left.left.left = &TreeNode{val: "7"} sNode.left.left.right = &TreeNode{val: "8"} sNode.left.right.left = &TreeNode{val: "9"} sNode.left.right.right = &TreeNode{val: "10"} sNode.right.left.left = &TreeNode{val: "11"} maxW, row := findBtMaxWidth(sNode) fmt.Printf("最大寬度: %v;在第 %v層", maxW, row) }
查找二叉樹最大寬度的代碼
func findBtMaxWidth(bt *TreeNode) (maxWidth int, maxInrow int) { row := 0 //臨時保存節點的隊列 var tempSaveNodeQueue []*TreeNode //保存寬度 count := 1 var currentRowEndNode *TreeNode var nextRowEndNode *TreeNode if bt != nil { nextRowEndNode = bt currentRowEndNode = nextRowEndNode tempSaveNodeQueue = append(tempSaveNodeQueue, bt) } for len(tempSaveNodeQueue) != 0 { count++ treeNode := tempSaveNodeQueue[0] tempSaveNodeQueue = tempSaveNodeQueue[1:] if treeNode.left != nil { nextRowEndNode = treeNode.left tempSaveNodeQueue = append(tempSaveNodeQueue, treeNode.left) } if treeNode.right != nil { nextRowEndNode = treeNode.right tempSaveNodeQueue = append(tempSaveNodeQueue, treeNode.right) } if currentRowEndNode == treeNode { row++ currentRowEndNode = nextRowEndNode if maxWidth < count { maxInrow = row maxWidth = count } count = 0 } } return }
代碼解讀
這里面的代碼大部分的邏輯還是很簡單的,
說一下在if判斷里面的代碼叭,為啥要分別將子節點的left、right分別賦值給nextRowEndNode
呢?
因為在一個子節點下面的left和right并不是全都存在的,有的時候會是個空,所以這里要分別賦值
if currentRowEndNode == treeNode
:這一個判斷里面,因為如果進入到了這個判斷里面就說明到了當前層的最后一個節點了,所以就要把下一層的最后一個節點賦值給當前層的最后一個節點;
因為還有一個要找出最大寬度的一個功能,所以這個maxWidth要和coutn做一個比較如果maxWidth比較小的話就將count賦值給maxWidth,同時將當前的層數賦值給maxInrow;
row
:而row
在這里面所充當的角色是當前是完成第幾行的操作
為啥這里要定義一個currentRowEndNode和nextRowEndNode?
這種的寫法按層來處理,當獲取到一個節點的時候,這時我就要拿到他們的子節點,如果現在不獲取子節點的話在后面是沒有辦法獲取的,當這一行結束的時候將nextRowEndNode賦值給currentRowEndNode,接下來nextRowEndNode再找下一層的最后一個節點。
原文鏈接:https://juejin.cn/post/6981023626619437070
相關推薦
- 2022-09-23 基于numpy實現邏輯回歸_python
- 2022-09-21 使用注解實現Redis緩存功能_Redis
- 2022-10-21 React封裝全屏彈框的方法_React
- 2022-12-03 如何基于Session實現短信登錄功能_Redis
- 2022-11-12 C語言楊氏矩陣查找算法實例講解_C 語言
- 2022-01-01 element對穿梭框對接口返回的數據其他字段進行校驗多個校驗
- 2022-08-23 構建?Python?命令行參數的?4?種常見方式_python
- 2022-07-11 jenkins數據遷移和備份
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支