日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer07.重建二叉树

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer07.重建二叉树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

劍指offer07重建二叉樹

題目 :

輸入某二叉樹的前序遍歷和中序遍歷的結果,請構建該二叉樹并返回其根節點。
假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。

示例 :

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

思路:

要根據給出的前序和中序遍歷,先確定樹的根節點,左子樹的范圍,右子樹的范圍
這樣的話就能快速的寫出代碼

前序遍歷 : [根節點 | 左子樹 | 右子數] 根左右
中序遍歷 : [左子樹 | 根節點 | 右子數] 左根右
1.
先找到根節點為3,那么前序的后面四個就是子樹的范圍
然后看中序遍歷的節點值為3的那個點,9位于3的左邊,那么他就是在左子樹
15,20,7 在3的右邊,那么他們是右子數里面的節點

  • 前序 : [3 | 9 | 20,15,7]
  • 中序 : [9 | 3 | 15,20,7]
    那我們現在至少可以畫出個這樣的圖

    2.那么第一個的樹基本結構就已經完成了
    再將他細分
    樹可以分為左子樹右子樹,根節點
    但是右子樹又能看做一個樹來排部
    其實這就是一個遞歸的過程
    分析方法和第一步一樣
    右子數的前序 : [20 | 15 | 7]
    右子數的中序 : [15 | 20 | 7]
    這樣就將一個樹分成多個部分,多個部分又能劃分為更小的部分
    這樣一步一步的往下走那么就能將整個數給劃分出來

這樣我們就能夠根據這個思路來寫出算法
遞歸的實現
需要進行判斷哦
若是測試用例傳入為空可能就會報錯

type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func buildTree(preorder []int, inorder []int) *TreeNode {length := len(preorder)if length == 0 {return nil}newTree = &TreeNode{preorder[0],nil,nil}var indexTree int //用來標記在中序遍歷中的根節點位置for i := 0;i < length;i++ {// 利用for循環來找到根節點在中序遍歷中的位置if inorder[i] == preorder[0]{indexTree = ibreak}}newTree.Left = buildTree(preorder[1:indexTree+1],inorder[:indexTree])newTree.Right = buildTree(preorder[indexTree+1:],inorder[indexTree+1:])return newTree }

這樣我們就能夠構建一顆給定的二叉樹了

總結

以上是生活随笔為你收集整理的剑指offer07.重建二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。