網(wǎng)站首頁 編程語言 正文
Go語言數(shù)據(jù)結(jié)構(gòu)之二叉樹必會(huì)知識(shí)點(diǎn)總結(jié)_Golang
作者:yi個(gè)俗人 ? 更新時(shí)間: 2022-10-22 編程語言前言
如果你是一個(gè)開發(fā)人員,或多或少對(duì)樹型結(jié)構(gòu)都有一定的認(rèn)識(shí),我個(gè)人對(duì)樹型數(shù)據(jù)結(jié)構(gòu)是又愛又恨。二叉樹作為樹的一種,是一種重要的數(shù)據(jù)結(jié)構(gòu),也是面試官經(jīng)常考的東西。這篇文章主要分享下關(guān)于二叉樹相關(guān)的知識(shí)點(diǎn),并用go語言實(shí)現(xiàn)一個(gè)二叉樹和對(duì)二叉樹進(jìn)行遍歷。
二叉樹概念
二叉樹是具有兩個(gè)節(jié)點(diǎn)的樹形結(jié)構(gòu),通常左邊的子樹被稱為左子樹,右邊的子樹稱為右子樹,圖示如下:
在代碼中我們可以用代碼來定義一個(gè)二叉樹結(jié)構(gòu):
type treeNode struct { Val string //節(jié)點(diǎn)值 left *treeNode //左節(jié)點(diǎn) right *treeNode //右節(jié)點(diǎn) }
二叉樹的性質(zhì)
若二叉樹結(jié)點(diǎn)的層次從1開始,則在二叉樹第i層最多有2i-1 (i > 0)個(gè)節(jié)點(diǎn)。
深度為k的二叉樹至少有k個(gè)結(jié)點(diǎn),最多有2i - 1個(gè)結(jié)點(diǎn)。
對(duì)任何一個(gè)二叉樹,如果其葉結(jié)點(diǎn)有n0 個(gè),度為2的非葉結(jié)點(diǎn)有n2 個(gè),則有 n0 = n2 + 1
具有n個(gè)結(jié)點(diǎn)的完全二叉樹的深度為?log2(??+1)?
創(chuàng)建二叉樹
// 創(chuàng)建節(jié)點(diǎn) func CreateBinaryTree(data string) *treeNode { return &treeNode{data, nil, nil} } // 插入節(jié)點(diǎn) func (node *treeNode) Insert(n *treeNode, data string) bool { cur := n for cur != nil { if cur.Val < data { if cur.Right != nil { cur = cur.Right } else { cur.Right = CreateBinaryTree(data) return true } } else { if cur.Left != nil { cur = cur.Left } else { cur.Left = CreateBinaryTree(data) return true } } } return false }
樹的遍歷
樹的遍歷分為三種方式,分別為前序遍歷,中序遍歷,后序遍歷。
前序遍歷(V-L-R)
前序遍歷訪問順序?yàn)橄容?root 結(jié)點(diǎn),然后再輸出左子樹,然后再輸出右子樹。
我們通過遞歸的方式進(jìn)行遍歷
func preOrder(root *bt) { if root != nil { fmt.Print(root.Val, " ") preOrder(root.Left) preOrder(root.Right) } }
中序遍歷(L-V-R)
中序遍歷訪問順序?yàn)橄容敵?root 的左子樹,再輸 root 結(jié)點(diǎn),最后輸出 root 的右子樹。
func inOrder(root *bt) { if root != nil { inOrder(root.Left) fmt.Print(root.Val, " ") inOrder(root.Right) } }
后序遍歷(L-R-V)
后序遍歷訪問順序?yàn)橄容敵?root 的左子樹,最后輸出 root 的右子樹,再輸 root 結(jié)點(diǎn)。
func posOrder(root *bt) { if root != nil { posOrder(root.Left) posOrder(root.Right) fmt.Print(root.Val, " ") } }
原文鏈接:https://juejin.cn/post/7135758520955174920
相關(guān)推薦
- 2022-11-10 Android自定義DataTimePicker日期時(shí)間選擇器使用詳解_Android
- 2022-06-09 Linux、ubuntu系統(tǒng)下查看顯卡型號(hào)、顯卡信息詳解_Linux
- 2023-01-08 Android消息機(jī)制原理深入分析_Android
- 2022-08-25 C++超詳細(xì)梳理IO流操作_C 語言
- 2023-07-04 spring boot security之前后端分離配置
- 2023-03-16 Python?asyncio異步編程常見問題小結(jié)_python
- 2022-04-11 C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能(窗體)_C#教程
- 2022-01-16 DOM簡(jiǎn)介及獲取元素方法屬性總結(jié)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支