如題,根據前序與中序遍歷序列構造二叉樹
整體思路:
① 前序遍歷的第乙個元素,必然是二叉樹的根節點
② 在中序遍歷中找到前序遍歷第乙個元素的位置
③ 該位置左邊的所有點都是二叉樹的左子樹元素,該位置右邊的所有點都是二叉樹的右子樹元素
思路一:遞迴+字典
由整體思路可以構建子函式用於遞迴,不斷求子樹的左右子樹,直到葉子節點。
**如下:
# 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前序與中序遍歷的序列有乙個特點 對於某棵樹來講,先序遍歷的序列的長度與...