利用前中遍歷重創二叉樹

2021-10-07 01:24:14 字數 1325 閱讀 9684

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

例如給出:

前序遍歷 preorder = [3,9,20,15,7]

中序遍歷 inorder = [9,3,15,20,7]

輸出結果:

[3,9,20,null,null,15,7]

解答思路:

首先我們先來理一下思路如何根據前中遍歷,來構造二叉樹,這就不得不看一下前中遍歷的特點分別是什麼了

前序遍歷:【根節點|左子樹|右子樹】,也就是說【1,2,3】中,明確1是根,那麼2和3就是左右子樹,或者全在左子樹,或者全在右子樹。

中序遍歷:【左子樹|根節點|右子樹】,也就是說【1,2,3】中,明確1是根,那麼,2和3均在右子樹,明確2是根,那麼1在左子樹,3在右子樹

題目又說各節點值不同

根據前中遍歷特點,我們就容易得到規律:

前序遍歷中左子樹的第乙個值為根的左孩子,右子樹的第乙個值為根的右孩子;

前序遍歷中根的左孩子索引很容易就是在根的索引加一,但要得到根的右孩子,必須知道左子樹的長度,這就要用到中序遍歷來為我們提供左右子樹的長度了

根據以上特點,可以按順序完成以下工作:

前序遍歷的首個元素即為根節點 root 的值;

在中序遍歷中搜尋根節點 root 的索引 ,可將中序遍歷劃分為 [ 左子樹 | 根節點 | 右子樹 ] 。

根據中序遍歷中的左(右)子樹的節點數量,可將前序遍歷劃分為 [ 根節點 | 左子樹 | 右子樹 ] 。

```python

class solution:

def buildtree(self, preorder: list[int], inorder: list[int]) -> treenode:

self.pre,self.ino=preorder,inorder

return self.rt(0,0,len(inorder)-1)

def rt(self,pre_rt,left,right):

if left>right:

return

t_rt=treenode(self.pre[pre_rt])

i=self.ino.index(self.pre[pre_rt])

t_rt.left=self.rt(pre_rt+1,left,i-1)

t_rt.right=self.rt(i-left+pre_rt+1,i+1,right)

return t_rt

前中遍歷建立二叉樹

1 兩個二叉樹是否相等 2 前中遍歷建立二叉樹 bool equal btnode pa,btnode pb 或者 bool equal btnode pa,btnode pb if pa null pb null 有乙個為空,乙個不為空 if pa data pb data else return...

二叉樹遍歷方式(前 中 後序)

順序是針對根節點來說的。前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。中序遍歷首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。在遍歷左 右子樹時,仍然先遍歷左子樹,再訪問根結點,最後遍歷右子樹。後序遍歷指在訪問根結點 遍歷...

二叉樹的前中後序遍歷

秋招記錄 對一棵二叉樹進行遍歷,我們可以採取3種順序進行遍歷,分別是前序遍歷 中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是n,左節點是l,右節點是r,那麼對應的訪問遍歷順序如下 前序遍歷 中左右 n l r 中序遍歷 左中右 l n r 後序遍歷 左右中 l r n ...