当前位置: 首页 > news >正文

双非本科准备秋招(15.3)—— 力扣二叉树

        今天学了二叉树结点表示法,建树代码如下。

public class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val = val;}public TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}@Overridepublic String toString() {return String.valueOf(val);}
}

        我们建一棵树,然后使用递归的方式前中后序遍历(preOrder、inOrder、postOrder),再使用非递归方式遍历(traversal)。

public class Test {public static void main(String[] args) {TreeNode root = new TreeNode(1,new TreeNode(2, new TreeNode(4, null, null), null),new TreeNode(3, new TreeNode(5, null, null), new TreeNode(6, null, null)));preOrder(root);inOrder(root);postOrder(root);traversal(root);}

建的树如下:

        递归深度遍历:

/*** 前序*/public static void preOrder(TreeNode t){if(t == null) return;System.out.println(t.val);preOrder(t.left);preOrder(t.right);}/*** 中序*/public static void inOrder(TreeNode t){if(t == null) return;inOrder(t.left);System.out.println(t.val);inOrder(t.right);}/*** 后序*/public static void postOrder(TreeNode t){if(t == null) return;postOrder(t.left);postOrder(t.right);System.out.println(t.val);}

        非递归的方式

        使用以下代码可以通用前中后序的遍历。

    /*** 一套代码通用遍历,改造后序遍历*/public static void traversal(TreeNode t){LinkedList<TreeNode> stack = new LinkedList<>();TreeNode pop = null;while(t != null || !stack.isEmpty()){if(t != null){//左子树还没处理System.out.println("前序: " + t.val);stack.push(t);t = t.left;}else{TreeNode peek = stack.peek();if(peek.right == null){//右子树为空System.out.println("中序: " + peek.val);pop = stack.pop();System.out.println("后序: " + pop.val);}else if(peek.right == pop){//右子树处理完成pop = stack.pop();System.out.println("后序: " + pop.val);}else{//右子树还没处理System.out.println("中序: " + peek.val);t = peek.right;}}}}

使用以上知识解决如下题目:

1、144. 二叉树的前序遍历 

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();LinkedList<TreeNode> stack = new LinkedList<>();TreeNode pop = null;while(root != null || !stack.isEmpty()){if(root != null){list.add(root.val);stack.push(root);root = root.left;}else{TreeNode peek = stack.peek();if(peek.right == null || peek.right == pop){pop = stack.pop();}else{root = peek.right;}}}return list;}
}

2、94. 二叉树的中序遍历

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();LinkedList<TreeNode> stack = new LinkedList<>();TreeNode pop = null;while(root != null || !stack.isEmpty()){if(root != null){stack.push(root);root = root.left;}else{TreeNode peek = stack.peek();if(peek.right == null){list.add(peek.val);pop = stack.pop();}else if(peek.right == pop){pop = stack.pop();}else{list.add(peek.val);root = peek.right;}}}return list;}
}

3、145. 二叉树的后序遍历

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();LinkedList<TreeNode> stack = new LinkedList<>();TreeNode pop = null;while(root != null || !stack.isEmpty()){if(root != null){stack.push(root);root = root.left;}else{TreeNode peek = stack.peek();if(peek.right == null || peek.right == pop){pop = stack.pop();list.add(peek.val);}else{root = peek.right;}}}return list;}
}

相关文章:

  • 【C++入门学习指南】:函数重载提升代码清晰度与灵活性
  • MTK8365安卓核心板_联发科MT8365(Genio 350)核心板规格参数
  • 第二章 Redis介绍及安装
  • 前端常见标签
  • Android systemui 编译
  • 参考数据集INRIA Holidays dataset
  • GO EASY 框架 之 NET 05
  • Banana Pi BPI-R4开源路由器开发板快速上手用户手册,采用联发科MT7988芯片设计
  • 2024 高级前端面试题之 HTTP模块 「精选篇」
  • vscode实时预览markdown效果
  • 类银河恶魔城学习记录1-5 CollisionCheck源代码 P32
  • 基于WordPress开发微信小程序2:决定开发一个wordpress主题
  • P8706 [蓝桥杯 2020 省 AB1] 解码--2024蓝桥杯冲刺省一
  • Javascript第八个知识点:函数
  • 华为数通方向HCIP-DataCom H12-831题库(填空题)
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Github访问慢解决办法
  • Javascript基础之Array数组API
  • learning koa2.x
  • React-Native - 收藏集 - 掘金
  • vue总结
  • 大快搜索数据爬虫技术实例安装教学篇
  • 基于webpack 的 vue 多页架构
  • 计算机常识 - 收藏集 - 掘金
  • 前端临床手札——文件上传
  • 如何用vue打造一个移动端音乐播放器
  • 原生 js 实现移动端 Touch 滑动反弹
  • const的用法,特别是用在函数前面与后面的区别
  • ​决定德拉瓦州地区版图的关键历史事件
  • $.proxy和$.extend
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C++)八皇后问题
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (一)RocketMQ初步认识
  • (转) ns2/nam与nam实现相关的文件
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET中GET与SET的用法
  • .net专家(高海东的专栏)
  • /etc/fstab和/etc/mtab的区别
  • @Import注解详解
  • [20140403]查询是否产生日志
  • [20190113]四校联考
  • [Angular 基础] - 数据绑定(databinding)
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步