第一周 二叉樹

今年又開始了举哟,今天主要是總結(jié)上兩周的做題記錄,這幾天還是有點放松,懈怠了敞临,必須要抓緊了

上周主要完成了簡單的二叉樹算法題

二叉樹的中序遍歷

這題主要是開始復(fù)習(xí)二叉樹的遍歷,需要學(xué)習(xí)的知識分別是二叉樹的前序麸澜,中序挺尿,以及后序遍歷,同時需要關(guān)注針對遞歸返回的數(shù)組怎么處理

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func inorderTraversal(root *TreeNode) []int {
    if root == nil{
        return nil
    }
    var ret []int
    if root.Left != nil{
        ret = append(ret,inorderTraversal(root.Left)...)
    }
    ret = append(ret,root.Val)
    if root.Right != nil{
        ret = append(ret,inorderTraversal(root.Right)...)
    }
    return ret
}

相同的樹

這題一樣也就比較簡單了炊邦,之前會先思考通過遍歷的方式编矾,獲取到一個數(shù)組,然后判斷兩個數(shù)組是否相等
但是同樣的铣耘,可以通過遞歸進行處理洽沟,這題就和鏡像樹的邏輯大同小異了

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSameTree(p *TreeNode, q *TreeNode) bool {
    if p == nil && q == nil{
        return true
    }
    if p == nil || q == nil{
        return false
    }
    if p.Val != q.Val{
        return false
    }
    return isSameTree(p.Left,q.Left)&&isSameTree(p.Right,q.Right)
}

翻轉(zhuǎn)二叉樹

這題還是比較看重結(jié)題思路的,優(yōu)先演繹一下怎么進行翻轉(zhuǎn)蜗细,可以發(fā)現(xiàn)裆操,通過交換每個根節(jié)點的左右的節(jié)點,就能實現(xiàn)對二叉樹的翻轉(zhuǎn)

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func invertTree(root *TreeNode) *TreeNode {
    if root == nil{
        return root
    }
    if root.Left == nil && root.Right==nil{
        return root
    }
    var ret = root.Left
    root.Left = root.Right
    root.Right = ret
    invertTree(root.Left)
    invertTree(root.Right)
    return root
}

叉樹的最大最小深度

最小深度因為需要考慮空節(jié)點的情況炉媒,所以邊界條件較多
當根節(jié)點有一個為子節(jié)點為空的情況下踪区,應(yīng)該返回較大的節(jié)點數(shù)
當根節(jié)點兩個子節(jié)點都為空的情況下,直接返回0
當根節(jié)點兩個子節(jié)點都不為空的情況下吊骤,直接返回較小的

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func minDepth(root *TreeNode) int {
    if root == nil{
        return 0
    }
    lDepth := minDepth(root.Left)
    rDepth := minDepth(root.Right)
    if  lDepth == 0{
        return rDepth +1
    }
    if rDepth == 0{
        return lDepth +1
    }
    if lDepth <= rDepth {
        return lDepth+1
    }
    return rDepth + 1
}

最大深度不需要考慮結(jié)果的邊界情況

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxDepth(root *TreeNode) int {
    if root == nil{
        return 0
    }
    leftRet := maxDepth(root.Left)
    rightRet := maxDepth(root.Right)
    if leftRet+1 >=rightRet+1{
        return leftRet+1
    }
    return rightRet+1
}

將有序數(shù)組轉(zhuǎn)換為二叉搜索樹

結(jié)束條件為左大于右的情況下
處理的邏輯為為左右節(jié)點賦值
這題也是需要思路的缎岗,還是要經(jīng)過事先的演繹進行推導(dǎo),通過使用二分法白粉,中間節(jié)點為根節(jié)點

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func sortedArrayToBST(nums []int) *TreeNode {
    if nums == nil{
        return nil
    }
    return helper(nums,0,len(nums)-1)
}

func helper(nums []int,left ,right int)*TreeNode{
    if left > right{
        return nil
    }
    var (
        mid = (left + right)/2
        root TreeNode
    )
    root.Val = nums[mid]
    root.Left = helper(nums,left,mid -1)
    root.Right = helper(nums,mid+1,right)
    return &root
}

路徑總和

遞歸法 退出邏輯:當當前節(jié)點為的左右節(jié)點為空同時當前值==剩余值
處理邏輯 遍歷左右節(jié)點传泊,分別-根節(jié)點值

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func hasPathSum(root *TreeNode, targetSum int) bool {
    if root == nil{
        return false
    }
    if root.Left ==nil&& root.Right == nil &&targetSum-root.Val == 0{
        return true
    }
    if  hasPathSum(root.Left,targetSum - root.Val){
        return true
    }
    if  hasPathSum(root.Right,targetSum-root.Val){
        return true
    }
    
    return false
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼠渺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子眷细,更是在濱河造成了極大的恐慌拦盹,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溪椎,死亡現(xiàn)場離奇詭異普舆,居然都是意外死亡,警方通過查閱死者的電腦和手機校读,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門沼侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歉秫,你說我怎么就攤上這事蛾洛。” “怎么了端考?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵雅潭,是天一觀的道長。 經(jīng)常有香客問我却特,道長扶供,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任裂明,我火速辦了婚禮椿浓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闽晦。我一直安慰自己扳碍,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布仙蛉。 她就那樣靜靜地躺著笋敞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荠瘪。 梳的紋絲不亂的頭發(fā)上夯巷,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音哀墓,去河邊找鬼趁餐。 笑死,一個胖子當著我的面吹牛篮绰,可吹牛的內(nèi)容都是我干的后雷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼臀突!你這毒婦竟也來了勉抓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤候学,失蹤者是張志新(化名)和其女友劉穎琳状,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盒齿,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年困食,在試婚紗的時候發(fā)現(xiàn)自己被綠了边翁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡硕盹,死狀恐怖符匾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘩例,我是刑警寧澤啊胶,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站垛贤,受9級特大地震影響焰坪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聘惦,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一某饰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧善绎,春花似錦黔漂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剂跟,卻和暖如春减途,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浩聋。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工观蜗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衣洁。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓墓捻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子砖第,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 1撤卢、二叉樹的遍歷 遍歷是數(shù)據(jù)結(jié)構(gòu)中常見的操作,主要是將所有元素都訪問一遍梧兼。對于線性結(jié)構(gòu)來說放吩,遍歷分為兩種:正序遍歷...
    code希必地閱讀 2,553評論 0 0
  • 上一篇文章講述了樹的概念, 特征以及分類羽杰, 旨在讓我們理解什么是樹渡紫, 樹的一些常用的概念是什么,樹的分類有哪些等考赛。...
    DevCW閱讀 2,035評論 4 10
  • 因為之前就復(fù)習(xí)完數(shù)據(jù)結(jié)構(gòu)了惕澎,所以為了保持記憶,整理了一份復(fù)習(xí)綱要颜骤,復(fù)習(xí)的時候可以看著綱要想具體內(nèi)容唧喉。 樹 樹的基本...
    牛富貴兒閱讀 6,904評論 3 10
  • 目錄 1 左神部分集錦 2 Leetcode前150題 3 牛客網(wǎng)劍指offer 4 JavaG 5 題目中的...
    小小千千閱讀 1,012評論 0 0
  • 算法思想貪心思想雙指針排序快速選擇堆排序桶排序荷蘭國旗問題二分查找搜索BFSDFSBacktracking分治動態(tài)...
    第六象限閱讀 3,130評論 0 0