Skip to content

Commit f1d57f9

Browse files
committed
Add files.
1 parent 7dd0bac commit f1d57f9

5 files changed

+823
-436
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"# LeetCode0105从前序与中序遍历序列构造二叉树 Construct Binary Tree from Preorder and Inorder Traversal\n",
8+
"\n",
9+
"[重建二叉树LeetCode](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)\n",
10+
"\n",
11+
">题目描述:\n",
12+
"根据一棵树的前序遍历与中序遍历构造二叉树。\n",
13+
"注意:\n",
14+
"你可以假设树中没有重复的元素。\n",
15+
"例如,给出\n",
16+
"\n",
17+
"```\n",
18+
"preorder = [3,9,20,15,7]\n",
19+
"inorder = [9,3,15,20,7]\n",
20+
"\n",
21+
"返回二叉树:\n",
22+
" 3\n",
23+
" / \\\n",
24+
" 9 20\n",
25+
" / \\\n",
26+
" 15 7\n",
27+
" \n",
28+
"preorder = [1,2,4,7,3,5,6,8]\n",
29+
"inorder = [4,7,2,1,5,3,8,6]\n",
30+
"\n",
31+
"返回二叉树:\n",
32+
" 1\n",
33+
" / \\\n",
34+
" 2 3\n",
35+
" / / \\\n",
36+
" 4 5 6\n",
37+
" \\ /\n",
38+
" 7 8\n",
39+
"```\n",
40+
"\n",
41+
">思路:\n",
42+
">\n",
43+
">前序的第一个元素是根结点的值,在中序中找到该值,中序中该值的左边的元素是根结点的左子树,右边是右子树,然后递归的处理左边和右边\n",
44+
">提示:二叉树结点,以及对二叉树的各种操作\n",
45+
"\n",
46+
"首先要知道一个结论,前序/后序+中序序列可以唯一确定一棵二叉树,所以自然而然可以用来建树。\n",
47+
"\n",
48+
"有如下特征:\n",
49+
"1. 前序中左起第一位`1`肯定是根结点,我们可以据此找到中序中根结点的位置`rootin`;\n",
50+
"2. 中序中根结点左边就是左子树结点,右边就是右子树结点,即`[左子树结点,根结点,右子树结点]`,我们就可以得出左子树结点个数为`int left = rootin - leftin;`;\n",
51+
"3. 前序中结点分布应该是:`[根结点,左子树结点,右子树结点]`;\n",
52+
"4. 根据前一步确定的左子树个数,可以确定前序中左子树结点和右子树结点的范围;\n",
53+
"5. 如果我们要前序遍历生成二叉树的话,下一层递归应该是:\n",
54+
" - 左子树:`root->left = pre_order(前序左子树范围,中序左子树范围,前序序列,中序序列);`;\n",
55+
" - 右子树:`root->right = pre_order(前序右子树范围,中序右子树范围,前序序列,中序序列);`。\n",
56+
"6. 每一层递归都要返回当前根结点`root`;\n"
57+
]
58+
},
59+
{
60+
"cell_type": "code",
61+
"execution_count": 1,
62+
"metadata": {},
63+
"outputs": [
64+
{
65+
"name": "stdout",
66+
"output_type": "stream",
67+
"text": [
68+
"前序:\n",
69+
"[1, 2, 4, 7, 3, 5, 6, 8]\n",
70+
"中序:\n",
71+
"[4, 7, 2, 1, 5, 3, 8, 6]\n",
72+
"后序:\n",
73+
"[7, 4, 2, 5, 8, 6, 3, 1]\n"
74+
]
75+
}
76+
],
77+
"source": [
78+
"# Definition for a binary tree node.\n",
79+
"class TreeNode:\n",
80+
" def __init__(self, x):\n",
81+
" self.val = x\n",
82+
" self.left = None\n",
83+
" self.right = None\n",
84+
"\n",
85+
"class Solution:\n",
86+
" def buildTree(self, preorder, inorder):\n",
87+
" \"\"\"\n",
88+
" :type preorder: List[int]\n",
89+
" :type inorder: List[int]\n",
90+
" :rtype: TreeNode\n",
91+
" \"\"\"\n",
92+
" if not preorder or not inorder:\n",
93+
" return None\n",
94+
" x = preorder.pop(0)\n",
95+
" node = TreeNode(x)\n",
96+
" idx = inorder.index(x)\n",
97+
" \n",
98+
" node.left = self.buildTree(preorder[:idx],inorder[:idx])\n",
99+
" node.right = self.buildTree(preorder[idx:],inorder[idx+1:])\n",
100+
" #返回二叉树根节点\n",
101+
" return node\n",
102+
"\n",
103+
"#下面是打印前序、中序和后序\n",
104+
"def Preorder(root):\n",
105+
" res = []\n",
106+
" if root: #节点为None时,跳过\n",
107+
" res.append(root.val)\n",
108+
" res = res + Preorder(root.left)\n",
109+
" res = res + Preorder(root.right)\n",
110+
" return res\n",
111+
"\n",
112+
"def Inorder(root):\n",
113+
" res = []\n",
114+
" if root: #节点为None时,跳过\n",
115+
" res = res + Inorder(root.left)\n",
116+
" res.append(root.val)\n",
117+
" res = res + Inorder(root.right)\n",
118+
" return res\n",
119+
"\n",
120+
"def Postorder(root):\n",
121+
" res = []\n",
122+
" if root: #节点为None时,跳过\n",
123+
" res += Postorder(root.left)\n",
124+
" res += Postorder(root.right)\n",
125+
" res.append(root.val)\n",
126+
" return res\n",
127+
" \n",
128+
"# 测试:\n",
129+
"solu = Solution()\n",
130+
"# preorder = [3,9,20,15,7]\n",
131+
"# inorder = [9,3,15,20,7]\n",
132+
"\n",
133+
"preorder = [1,2,4,7,3,5,6,8]\n",
134+
"inorder = [4,7,2,1,5,3,8,6]\n",
135+
"\n",
136+
"node = solu.buildTree(preorder, inorder)\n",
137+
"print(\"前序:\")\n",
138+
"print(Preorder(node))\n",
139+
"print(\"中序:\")\n",
140+
"print(Inorder(node))\n",
141+
"print(\"后序:\")\n",
142+
"print(Postorder(node))"
143+
]
144+
}
145+
],
146+
"metadata": {
147+
"kernelspec": {
148+
"display_name": "Python 3",
149+
"language": "python",
150+
"name": "python3"
151+
},
152+
"language_info": {
153+
"codemirror_mode": {
154+
"name": "ipython",
155+
"version": 3
156+
},
157+
"file_extension": ".py",
158+
"mimetype": "text/x-python",
159+
"name": "python",
160+
"nbconvert_exporter": "python",
161+
"pygments_lexer": "ipython3",
162+
"version": "3.7.3"
163+
}
164+
},
165+
"nbformat": 4,
166+
"nbformat_minor": 2
167+
}

0 commit comments

Comments
 (0)