• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
长发不及肩
博客园    首页    新随笔    联系   管理    订阅  订阅
剑指offer(2)

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

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

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

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

##反转链表

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

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

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

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

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

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

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

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

public ArrayList<Integer> solution(ListNode listnode){

ArrayList<Integer> list = new ArrayList;

if(listnode == null){

  return list;

}

Stack<ListNode> stack = new Stack;

while(listnode != null){

  stack.push(listnode);

  listnode = listnode.next;

}

while(!stack.isEmpty()){

  list.add(stack.pop().val);

}

return list;

}

##递归

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

 

题目描述——重建二叉树

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

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

输入

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

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

则重建二叉树并返回。

#分析

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

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

递归思想

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

定义二叉树的类

public static class TreeNode{

int value;

TreeNode Left;

TreeNode Right;

TreeNode(int x) {value=x};

}

递归建树

public TreeNode reConstruction(int [] pre, int [] in){

TreeNode root = new TreeNode(pre[0]);

for(int i =0; i<pre.length; i++){

  if(pre[0] = in[i]{

    root.left() = reConstruction(Array.CopyofRange(pre, 1, i+1), Array.CopyofRange(in, 0, i);

    root.right = reConstruction(Array.CopyofRange(pre, i+1, pre.length), Array.CopyofRange(in, i, pre.length);

  }

}

}

更加严谨可以添加代码

if(pre = null || in == null)

  return list;

if(pre.length = 0 || in.length = 0)

  return list;

if(pre.length != in.length)

  return list;

posted on 2020-05-16 23:55  长发不及肩  阅读(147)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3