【LeetCode】105#从前序与中序遍历序列构造二叉树
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode】105#从前序与中序遍历序列构造二叉树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重復的元素。
例如,給出
前序遍歷 preorder = [3,9,20,15,7] 中序遍歷 inorder = [9,3,15,20,7]返回如下的二叉樹:
3/ \9 20/ \15 7解題思路
首先列舉一下二叉樹的三種常見遍歷方式:
- 前序遍歷:根 - 左 - 右
- 中序遍歷:左 - 根 - 右
- 后序遍歷:左 - 右 - 根
可以發現,「前中后」是指根節點在三個節點中的相對順序。
根據二叉樹遍歷的特點,前序遍歷的第一個節點一定是整棵二叉樹的根節點,根據這一特點找到根節點,新建一棵二叉樹。找到根節點后,在中序遍歷的序列中找到根節點的值對應的位置,以這個節點為界,左邊是根節點的左子樹,右邊是根節點的右子樹。最后利用遞歸的方法,構造起整棵二叉樹。
具體實現
我們需要一個輔助函數
private TreeNode help(int startPre, int startIn,int endIn,int[] preorder, int[] inorder)
其中:
- int satrtPre用來在前序遍歷序列中定位根節點
- int startIn用來在中序遍歷序列中定位左子樹的起點(終點取決于根節點在中序遍歷序列中的位置)
- int endIn用來在中序遍歷序列中定位右子樹的終點(起點取決于根節點在中序遍歷序列中的位置)
此外,在每次迭代中,都要更新當前根節點在對應的中序遍歷序列中的索引,用int curInIndex表示
源代碼
public TreeNode buildTree (int[] preorder, int[] inorder) {return help(0,0,inorder.length - 1,preorder,inorder); }private TreeNode help(int startPre, int startIn,int endIn,int[] preorder, int[] inorder) {if (startPre > preorder.length - 1 || startIn > endIn) {return null;}TreeNode root = new TreeNode(preorder[startPre]);int curInIndex = 0; // 前根節點在對應的中序遍歷序列中的索引for (int i = startIn; i <= endIn; i++) {if (root.val == inorder[i]) {curInIndex = i;}}root.left = help(startPre + 1,startIn,curInIndex - 1,preorder,inorder);root.right = help(startPre + curInIndex - startIn + 1, curInIndex + 1, endIn, preorder, inorder);return root; }心得體會
在二叉樹的相關題目中,遞歸是很常用的一個方法,關鍵是找到遞歸的最小情況。現在掌握的還不熟練,需要多做一些樹和鏈表相關的題目。
轉載于:https://www.cnblogs.com/yuzhenzero/p/10266527.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【LeetCode】105#从前序与中序遍历序列构造二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果开发账号过期不续费会怎样?
- 下一篇: iTerm2 使用笔记