第一周 二叉樹

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

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

二叉樹的中序遍歷

這題主要是開始復(fù)習二叉樹的遍歷,需要學(xué)習的知識分別是二叉樹的前序,中序,以及后序遍歷,同時需要關(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容