Construct Tree From Array
题目描述1:
给定树的不同的遍历方式来重建树。第一种是根据先序遍历和中序遍历的结果来重建树。
例子:
这道题是leetcode上的题目,具体描述可以看这个。
解题思路:
根据先序遍历的结果我们可以知道树的根节点,根据中序遍历中该根节点的位置,我们可以知道左右子树的节点。假设先序遍历的结果是[1,2,4,5,3,6,7],中序遍历的结果是[4,2,5,1,6,3,7]。我们根据先序遍历的第一个节点是1,所以知道左子树的节点集合是[4,2,5],右子树的节点集合是[6,3,7];然后根据左子树的长度是3知道[2,4,5]是对应左子树的先序遍历的结果;而[3,6,7]则是右子树的先序遍历的结果。如此不断递归构建即可得到树的结果。
代码如下:
|
|
题目描述2:
当然,也可以根据中序遍历和后序遍历来重建树。解题的思路和上一题类似,我们主要需要注意的是,在递归函数中,起始位置和终止位置的变化如何计算的问题。
例子:
这题也是leetcode上的题目.
代码实现:
|
|
题目描述3:
给定一个数字n,要求得到根据这个数字所得到的数组[1,2,3…..n],从这个数组中构建搜索二叉树的个数。
例子:
给定数字假设为3,通过计算分别以1,2,3为头结点的有效的搜索二叉树的个数可以知道,其结果为5。
解题思路:
通过从1开始计算其可能的二叉树个数,可以发现规律:当n=1,二叉树的个数为1;当n=2的时候,二叉树的个数为2;当n=3的时候,二叉树的个数为5。分析n=3的情况:以1为头结点,用于构建左子树的数字为空,用于构建右子树的数字为[2,3],所以总的个数为h(0) h(2) = 2;同理在以2为头结点的情况下,个数为h(1) h(1) = 1;以3为头结点情况,h(2) h(0) = 1;所以一共有5种。通过推广到n;我们用h(i)表示用i个数构建二叉树的个数,h(0)=1,h(1)=1,h(2)=2…则h(n) = h(n-1) h(0) + h(n-2) * h(1)…这样所得到的序列称为卡特兰数序列。
代码如下:
|
|
题目描述4:
根据上一题的描述,我们要求返回所有有效的二叉树的头结点的集合。解题的思路,主要是利用递归构建树的想法,直接上代码。
代码如下:
|
|
题目描述5:
给定一个已经排序的数组,要求根据数组构建一棵平衡二叉搜索树.
具体的题目描述可以看LeetCode108。
解题思路:
因为要构建平衡二叉搜索树,所以我们可以从数组的中间取出作为根节点,然后递归的建立左右子树即可。
代码如下:
|
|