leetcode之Construct Binary Tree from Inorder and Postorder Traversal 问题

来源:互联网 发布:淘宝二手iphone能买吗 编辑:程序博客网 时间:2024/05/23 12:03

问题描述:

Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

啰嗦一句,可能学过数据结构的人看到题目就知道啥意思了,给的问题介绍和描述几乎没啥意思。

示例:

题目本身好像没给出具体案例,本人给了一个简陋版的二叉树,来帮助理解和分析。

在这把前序.中序和后序遍历的结果全都罗列出来了,为啥把前序遍历结果也罗列出来呢,是因为还有一道题它告诉的是前序和中序遍历结果。为了偷懒,就在这全给罗列出来了。

问题来源:Construct Binary Tree from Inorder and Postorder Traversal (具体链接:https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/#/description)

思路:对学过数据结构的人来讲,应该是没啥思路不思路的吧,也没啥技巧可言,无非就是递归和非递归两种方法。任选其一都OK啦!

          下面就大致讲一下递归求解过程(没学过数据结构的看看,学过的直接跳过):

                1)首先需要明白的一点是前序遍历的第一个节点和后序遍历的最后一个节点一定是原图的根节点;

                2)找到根节点之后,然后在中序遍历的结果序列中找到对应根节点的索引(在这本人采用了hashmap来存取索引了,明显还有更好的办法!),然后根节点左边的节点即为原图的左子树,根节点索引右边的节点便是原图的右子树(即上图的4, 2, 6, 5 即构成左子树,7, 3, 8即构成右子树);

                3)分别在左子树和右子树中递归地求解即可,重复上面的步骤就可以得到最终的二叉树了。

          下面我再讲讲我的代码里的build函数的各个参数的含义:

a)第一个:中序遍历结果inorder;

b)第二个:中序遍历结果的首指针in_start;

c)第三个:中序遍历结果的尾指针in_end(一首一尾的作用是定位哪些为左子树,哪些为右子树);

d)第四个:后序遍历结果postorder;

e)第五个:后序遍历的首指针post_start;

f)第六个:后序遍历的尾指针(作用同上)post_end;

g)第七个:用于存取索引的map。

最后再说一下定位的事情,因为很容易出错,一旦出错的话,递归就进行不下去或者结果不对。在中序序列中定位只需要采用index(出现在代码中)即可,因为寸的就是中序遍历结果的索引,而相反,你在后序遍历结果中定位的时候就需要求出长度然后再加上自己的开始索引(post_start),其实这就有点像偏移量和绝对地址的说法,index求出的中序序列中的绝对地址,而index同样可以求出在后序遍历结果当中的偏移量,需要加上起始地址才能构成绝对地址不是?完了,感觉有些人看了更晕了,那咱就先看代码吧。

代码:

题目给出的节点的定义:

具体解决方案:

一定注意分析leftChild和rightChild的各个指针的情况,不然很容易出错。



   

          






阅读全文
0 0
原创粉丝点击