摘要:樹的前序,中序遍歷的結構如下圖可以看出,通過前序遍歷可以確定根節點,再通過中序遍歷和根節點的位置可以確定出左子樹和右子樹。另外左子樹的前序遍歷和中序遍歷的順序跟在其父樹中的順序一樣。因此可以確定有一種遞歸解法。
從前序與中序遍歷序列構造二叉樹
今天帶來的是Leetcode上的一個經典題:從前序與中序遍歷序列構造二叉樹
原題干:
/**
Definition for a binary tree node.
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
*/
/**@param {number[]} preorder
@param {number[]} inorder
@return {TreeNode}
*/
input:前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
output: 樹的根節點
條件:
樹的結構為:{ val, left, right }
下面是我解決這個題的時候的思路
解題思路這個題目考察的是對樹結構和樹遍歷的熟悉程度。樹的前序,中序遍歷的結構如下圖:
可以看出,通過前序遍歷可以確定根節點,再通過中序遍歷和根節點的位置可以確定出左子樹和右子樹。另外左子樹的前序遍歷和中序遍歷的順序跟在其父樹中的順序一樣。
因此可以確定有一種遞歸解法。確定根和左右子樹,遞歸用左右子樹的前序和中序順序去獲取左右子樹。
代碼var buildTree = function(preorder, inorder) { if (preorder.length === 0) { return null } let leftTreeLen = 0 let rightTreeLen = 0 let tag = 1 for (let i = inorder.length - 1; i >= 0; i--) { if (inorder[i] !== preorder[0]) { if (tag) { rightTreeLen++ } else { leftTreeLen++ } } else if (inorder[i] === preorder[0]) { tag = false } } let root = new TreeNode(preorder[0]) // 根 root.left = buildTree(preorder.slice(1, 1 + leftTreeLen), inorder.slice(0, leftTreeLen)) root.right = buildTree(preorder.slice(1 + leftTreeLen), inorder.slice(-rightTreeLen)) return root };
晚上再更新一次,目測是有非遞歸的解法的。
本期算法小分享就到這里咯(leetcode正在做完探索里的中級。)如果有什么意見或者想法歡迎在評論區和我交流
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107905.html
摘要:二叉搜索樹的特性二叉搜索樹由于其獨特的數據結構,使得其無論在增刪,還是查找,時間復雜度都是,為二叉樹的高度。二叉搜索樹的查找查找很簡單,根據左子節點比該節點小,右子節點比該節點大的原則進行循環判斷即可。 什么是二叉樹 二叉樹就是樹的每個節點最多只能有兩個子節點 什么是二叉搜索樹 二叉搜索樹在二叉樹的基礎上,多了一個條件,就是二叉樹在插入值時,若插入值比當前節點小,就插入到左節點,否則插...
摘要:有效三角形的個數雙指針最暴力的方法應該是三重循環枚舉三個數字。總結本題和三數之和很像,都是三個數加和為某一個值。所以我們可以使用歸并排序來解決這個問題。注意因為歸并排序需要遞歸,所以空間復雜度為 ...
摘要:因此,根據題目給出的先序遍歷和中序遍歷,可以畫出二叉樹選參考數據結構與算法描述實現二叉樹算法淺談數據結構二叉樹慕課網實現二叉樹算法前端樹控件騰訊軟件開發面試題 內容銜接上一章 數據結構與算法:常見排序算法 內容提要 什么是樹 - 為什么使用樹 二叉樹 二叉查找樹 紅黑樹 B、B+樹 堆 伸展樹 樹 可以點擊鏈接感受下筆者用d3.js畫的tree https://codepen...
閱讀 2686·2021-09-22 15:58
閱讀 2229·2019-08-29 16:06
閱讀 896·2019-08-29 14:14
閱讀 2809·2019-08-29 13:48
閱讀 2450·2019-08-28 18:01
閱讀 1494·2019-08-28 17:52
閱讀 3317·2019-08-26 14:05
閱讀 1609·2019-08-26 13:50