您的位置:首页 > Web前端

《剑指offer》---从尾到头打印链表 和 重建二叉树

2017-01-29 16:00 197 查看

《剑指offer》—从尾到头打印链表 和 重建二叉树

2017年1月29日记

一、面试题5:从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印每个节点的值。

假设面试官要求不能修改链表的结构,我们可以利用栈的后进先出,遍历链表,每经过一个节点时,把当前元素放入栈中。再从栈顶开始逐个输出值。

既然想到了用栈来实现,而递归本质上就是一个栈结构,于是也可以用递归来实现。当访问到一个结点时,先递归输出它后面的结点,再输出该自身结点,这样也可以。

基于递归的代码看似很简洁,但是有个问题,当链表长度非常长的时候,会导致函数调用的层级很深,从而导致函数调用栈溢出。

三、面试题6:重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入的前序遍历序列{1,2,4,7,3,5,6,8},和中序遍历{4,7,2,1,5,3,8,6}。

前序遍历的第一个结点1就是二叉树的根节点。扫描中序遍历序列,就能确定根节点的值的位置。根据中序遍历特点,1的前面三个数字就是左子树结点的值,1后面的4个数字就是右子树结点的值。

同样,在前序遍历的序列中,根节点后面的三个数字就是3个左子树结点的值,在后面的数字就是右子树结点的值。这样我们就在前序遍历和中序遍历两个序列中,分别找到了左右子树对应的子序列。

既然我们已经分别找到了左右子树的前序遍历和中序遍历序列,我们就可以递归去分别构建左右子树。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: