105 從前序與中序遍歷序列構造二叉樹

2021-09-26 09:52:00 字數 2445 閱讀 5968

如題,根據前序與中序遍歷序列構造二叉樹

整體思路:

① 前序遍歷的第乙個元素,必然是二叉樹的根節點

② 在中序遍歷中找到前序遍歷第乙個元素的位置

③ 該位置左邊的所有點都是二叉樹的左子樹元素,該位置右邊的所有點都是二叉樹的右子樹元素

思路一:遞迴+字典

由整體思路可以構建子函式用於遞迴,不斷求子樹的左右子樹,直到葉子節點。

**如下:

# definition for a binary tree node.

class treenode:

def __init__(self, x):

self.val = x

self.left = none

self.right = none

from typing import list

class solution:

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

inorder_dic = #求每個字母在中序遍歷中的位置

print(inorder_dic)

# 遞迴求解子樹的左右子樹,直到葉子節點

# pre1, pre2, in1, in2 分別表示子樹在前序遍歷和中序遍歷序列的開始位置和結束位置

def buildsubtree(pre1, pre2, in1, in2, inorder_dic):

# 子串行只有乙個元素,說明是葉子節點了,返回該節點

if pre1 == pre2:

return treenode(preorder[pre1])

if pre1 > pre2:

return none

# 前序遍歷子串行的第乙個元素,表示該子樹的根節點,用top存放

top = preorder[pre1]

# 構建子樹

tree = treenode(top)

# 獲得該子樹的根節點在中序遍歷序列的位置

location = inorder_dic[top]

# 求該子樹的左子樹

# pre1 = pre+1; pre2 = pre1 + (location - in1);

# (location - in1)表示左子樹的元素個數,子樹根節點在中序遍歷的位置減去中序遍歷初始位置

# in1 = in1; in2 = location -1

tree.left = buildsubtree(pre1+1, pre1+(location-in1), in1, location-1, inorder_dic)

# 求該子樹的右子樹

# pre1 = pre1 + (location - in1) + 1; pre2 = pre2;

# 前序遍歷初始位置加上左子樹元素數後及根節點+1,為右子樹前序遍歷初始位置

# in1 = location + 1; in2 = in2

tree.right = buildsubtree(pre1+(location-in1)+1, pre2, location+1, in2, inorder_dic)

return tree

return buildsubtree(0, len(preorder) - 1, 0, len(inorder) - 1, inorder_dic)

if __name__ == "__main__":

preorder = [3,9,20,15,7]

inorder = [9,3,15,20,7]

print(solution.buildtree("", preorder, inorder))

**如下:
public treenode buildtree(int preorder, int inorder) 

stackroots = new stack();

int pre = 0;

int in = 0;

//先序遍歷第乙個值作為根節點

treenode curroot = new treenode(preorder[pre]);

treenode root = curroot;

roots.push(curroot);

pre++;

//遍歷前序遍歷的陣列

while (pre < preorder.length)

//設為當前的右孩子

curroot.right = new treenode(preorder[pre]);

//更新 curroot

curroot = curroot.right;

roots.push(curroot);

pre++;

} else

}return root;

}

Leetcode 從前序與中序遍歷序列構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 definition for a binary tree node...

105 從前序與中序遍歷序列構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 def buildtree2 preorder,inorder i...

105 從前序與中序遍歷序列構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3 9,20 15,7 中序遍歷 inorder 9 3,15 20,7 返回如下的二叉樹 3 9 20 157前序與中序遍歷的序列有乙個特點 對於某棵樹來講,先序遍歷的序列的長度與...