摘要:二分法復(fù)雜度時(shí)間空間思路我們先考察先序遍歷序列和中序遍歷序列的特點(diǎn)。對(duì)于中序遍歷序列,根在中間部分,從根的地方分割,前半部分是根的左子樹,后半部分是根的右子樹。
Construct Binary Tree from Preorder and Inorder Traversal
二分法 復(fù)雜度Given preorder and inorder traversal of a tree, construct the binary tree.
時(shí)間 O(N^2) 空間 O(N)
思路我們先考察先序遍歷序列和中序遍歷序列的特點(diǎn)。對(duì)于先序遍歷序列,根在最前面,后面部分存在一個(gè)分割點(diǎn),前半部分是根的左子樹,后半部分是根的右子樹。對(duì)于中序遍歷序列,根在中間部分,從根的地方分割,前半部分是根的左子樹,后半部分是根的右子樹。當(dāng)我們從上向下構(gòu)建樹時(shí),我們可以通過先序遍歷序列知道根節(jié)點(diǎn)的值,但是如何知道兩個(gè)序列是在哪里分割的呢?這就要依靠中序序列了。我們?cè)谥行蛐蛄兄姓业竭@個(gè)根的值,根據(jù)這個(gè)根的坐標(biāo),我們可以知道這個(gè)根左子樹有多少個(gè)節(jié)點(diǎn),右子樹有多少個(gè)節(jié)點(diǎn)。然后我們根據(jù)這個(gè)將先序遍歷序列分割,通過遞歸再次取每個(gè)部分的第一個(gè)作為根,同時(shí)為了下一次能準(zhǔn)確的計(jì)算出左右子樹各有多少節(jié)點(diǎn),我們也要同時(shí)對(duì)中序遍歷序列進(jìn)行分割。
代碼public class Solution { int preStart = 0; public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder.length == 0 || inorder.length == 0) return null; return helper(0,inorder.length - 1,preorder,inorder); } private TreeNode helper(int inStart, int inEnd, int[] preorder, int[] inorder){ // Base情況 if(preStart > preorder.length || inStart > inEnd){ return null; } TreeNode root = new TreeNode(preorder[preStart]); int inMid = 0; // 找到根在中序序列中的位置,從而知道先序中的分割點(diǎn) for(int i = inStart ; i <= inEnd; i++){ if(inorder[i] == preorder[preStart]){ inMid = i; } } preStart++; // 例如先序序列 1(234)(567) 中2是左子樹的根 root.left = helper(inStart, inMid - 1, preorder, inorder); // 先序序列 1(234)(567) 中5是右子樹的根 root.right = helper(inMid + 1, inEnd, preorder, inorder); return root; } }Construct Binary Tree from Inorder and Postorder Traversal
二分法 復(fù)雜度Given inorder and postorder traversal of a tree, construct the binary tree.
Note: You may assume that duplicates do not exist in the tree.
時(shí)間 O(N^2) 空間 O(N)
思路中序序列仍然是以根節(jié)點(diǎn)劃分為左右兩邊,而后序序列的特點(diǎn)則是根在最后,然后在跟前面的那部分中,前面部分是左子樹,后面的部分是右子樹。所以其實(shí)我們就是把上一題給反過來了。這題我們將后序序列的指針全局化,這樣我們可以先建好右子樹,再建左子樹,而指針只要順序從后向前就行了。
代碼public class Solution { int postEnd = 0; public TreeNode buildTree(int[] inorder, int[] postorder) { postEnd = postorder.length - 1; return helper(postorder, inorder, 0, inorder.length - 1); } private TreeNode helper(int[] postorder, int[] inorder, int inStart, int inEnd){ if(postEnd < 0 || inStart > inEnd){ return null; } TreeNode root = new TreeNode(postorder[postEnd--]); int inMid = 0; // 找到中序序列的根節(jié)點(diǎn) for(int i = inStart; i <= inEnd; i++){ if(inorder[i] == root.val){ inMid = i; break; } } // 建好右子樹 root.right = helper(postorder, inorder, inMid + 1, inEnd); // 建好左子樹 root.left = helper(postorder, inorder, inStart, inMid - 1); return root; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64544.html
摘要:做了幾道二分法的題目練手,發(fā)現(xiàn)這道題已經(jīng)淡忘了,記錄一下。這道題目的要點(diǎn)在于找的區(qū)間。邊界條件需要注意若或數(shù)組為空,返回空當(dāng)前進(jìn)到超出末位,或超過,返回空每次創(chuàng)建完根節(jié)點(diǎn)之后,要將加,才能進(jìn)行遞歸。 Construct Binary Tree from Inorder and Preorder Traversal Problem Given preorder and inorder t...
摘要:在線網(wǎng)站地址我的微信公眾號(hào)完整題目列表從年月日起,每天更新一題,順序從易到難,目前已更新個(gè)題。這是項(xiàng)目地址歡迎一起交流學(xué)習(xí)。 這篇文章記錄我練習(xí)的 LeetCode 題目,語言 JavaScript。 在線網(wǎng)站:https://cattle.w3fun.com GitHub 地址:https://github.com/swpuLeo/ca...我的微信公眾號(hào): showImg(htt...
摘要:思路在的順序里,先,然后再左右。所以根據(jù)可以知道的。接著再分別在和的里面重復(fù)找以及左右的過程。首先的包括和,以及對(duì)應(yīng)的起始和結(jié)束位置,對(duì)應(yīng)的起始和結(jié)束位置。返回值為,因?yàn)槊總€(gè)里要一個(gè),同時(shí)找到它的和,左右節(jié)點(diǎn)通過返回值獲得。同時(shí)的不需要了。 From Preorder and Inorder 思路在preorder的順序里,先root,然后再左右。所以根據(jù)preorder可以知道roo...
摘要:棧迭代復(fù)雜度時(shí)間空間遞歸棧空間對(duì)于二叉樹思路用迭代法做深度優(yōu)先搜索的技巧就是使用一個(gè)顯式聲明的存儲(chǔ)遍歷到節(jié)點(diǎn),替代遞歸中的進(jìn)程棧,實(shí)際上空間復(fù)雜度還是一樣的。對(duì)于先序遍歷,我們出棧頂節(jié)點(diǎn),記錄它的值,然后將它的左右子節(jié)點(diǎn)入棧,以此類推。 Binary Tree Preorder Traversal Given a binary tree, return the preorder tr...
摘要:有效三角形的個(gè)數(shù)雙指針最暴力的方法應(yīng)該是三重循環(huán)枚舉三個(gè)數(shù)字。總結(jié)本題和三數(shù)之和很像,都是三個(gè)數(shù)加和為某一個(gè)值。所以我們可以使用歸并排序來解決這個(gè)問題。注意因?yàn)闅w并排序需要遞歸,所以空間復(fù)雜度為 ...
閱讀 2538·2021-11-25 09:43
閱讀 2668·2021-11-16 11:50
閱讀 3333·2021-10-09 09:44
閱讀 3263·2021-09-26 09:55
閱讀 2870·2019-08-30 13:50
閱讀 1064·2019-08-29 13:24
閱讀 2121·2019-08-26 11:44
閱讀 2845·2019-08-26 11:37