码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer(2)

时间:2020-05-17 01:17:55      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:表头   中序遍历   递归   str   git   https   hub   一个栈   特性   

题目描述——从尾到头打印链表

输入一个链表,从尾到头打印链表每个节点的值。

输入描述:  输入为链表的表头

输出描述:  输出为需要打印的“新链表”的表头

##反转链表

首先我们想到的就是反转链表了,如果把链表反转了,然后再返回头,这样再次遍历的时候就相当于从尾到头打印了。

但是修改输入数据真的可行么?

剑指Offer中为我们在面试中提出了如下小提示

在面试时候,如果我们打算修改输入的数据,最好先问问面试官是不是允许修改

通常打印只是一个只读操作,我们肯定不希望输入时候修改链表的内容

##利用栈的后进先出特性

单链表的遍历只能从前往后,但是需要从尾往头输出,这不是典型的"先进后出"么,那么我们可以用栈模拟输出

每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。

##递归

递归在本质上就是一个栈结构,于是很自然地想到用递归来实现。要实现反过来输出链表,每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结构就反过来了。

 

题目描述——重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

输入

前序遍历序列{1,2,4,7,3,5,6,8}

中序遍历序列{4,7,2,1,5,3,8,6}

则重建二叉树并返回。

#分析

这道题还是比较简单的,我们知道

  • 前序遍历的顺序为:根左右
  • 中序遍历的顺序为:左根右

递归思想

  1. 我们先根据前序遍历序列的第一个确定根,然后在中序遍历的序列中找到根的位置,根左边的就是其左子树,右边就是其右子树
  2. 构建根和左右子树
  3. 递归的进行1和2

剑指offer(2)

标签:表头   中序遍历   递归   str   git   https   hub   一个栈   特性   

原文地址:https://www.cnblogs.com/cherry-BAIL/p/12903000.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!