本文用递归算法实现二叉树的前序、中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍历),94. Binary Tree Inorder Traversal(二叉树中序遍历),145. Binary Tree Postorder Traversal(二叉树后序遍历)。

基本概念

二叉树的遍历是根据访问结点操作发生位置命名:

前序:访问根结点的操作发生在遍历其左右子树之前。

中序:访问根结点的操作发生在遍历其左右子树之中。

后序:访问根结点的操作发生在遍历其左右子树之后。

模板准备

模板比较简单,废话不说了,直接上代码。

二叉树节点定义:
//Definition for a binary tree node.
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}

前序遍历:

public void preOrder(TreeNode node){
if(node == null){
return;
} System.out.println(node.val);
preOrder(node.left);
preOrder(node.right);
}

中序遍历:

public void inOrder(TreeNode node){
if(node == null){
return;
} inOrder(node.left);
System.out.println(node.val);
inOrder(node.right);
}

后序遍历:

public void postOrder(TreeNode node){
if(node == null){
return;
} postOrder(node.left);
postOrder(node.right);
System.out.println(node.val);
}

LeetCode题解

LeetCode上面关于二叉树遍历的问题有:

# Title
144 Binary Tree Preorder Traversal 
94 Binary Tree Inorder Traversal 
145 Binary Tree Postorder Traversal 

解答以上问题,只需要在遍历模板上稍作修改即可:题目要求返回类型是List,所以只需要在访问元素的时候把元素添加到结果列表中。

144. Binary Tree Preorder Traversal

class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ret =new ArrayList<Integer>();
preOrder(root,ret);
return ret;
} public void preOrder(TreeNode node,List<Integer> ret){
if(node == null){
return ;
}
ret.add(node.val);
preOrder(node.left,ret);
preOrder(node.right,ret);
}
}

94. Binary Tree Inorder Traversal

class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ret = new ArrayList<Integer>();
inOrder(root,ret);
return ret;
} public void inOrder(TreeNode node,List<Integer> ret){
if(node == null){
return ;
}
inOrder(node.left,ret);
ret.add(node.val);
inOrder(node.right,ret);
}
}

145. Binary Tree Postorder Traversal

class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ret =new ArrayList<Integer>();
postOrder(root,ret);
return ret;
} public void postOrder(TreeNode node,List<Integer> ret){
if(node == null){
return ;
}
postOrder(node.left,ret);
postOrder(node.right,ret);
ret.add(node.val);
}
}

总结

二叉树是天然的递归结构,利用此递归结构,可以巧妙地解决许多看似复杂的二叉树问题。

LeetCode二叉树的前序、中序、后序遍历(递归实现)的更多相关文章

  1. 分别求二叉树前、中、后序的第k个节点

    一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 ; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' ...

  2. 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现

    二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...

  3. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  4. 二叉树 遍历 先序 中序 后序 深度 广度 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. 前序+中序->后序 中序+后序->前序

    前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...

  6. SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  7. SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...

  8. 给出 中序&后序 序列 建树;给出 先序&中序 序列 建树

    已知 中序&后序  建立二叉树: SDUT 1489 Description  已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input  输入数据有多组,第一行是一个整数t (t& ...

  9. 【C&数据结构】---关于链表结构的前序插入和后序插入

    刷LeetCode题目,需要用到链表的知识,忽然发现自己对于链表的插入已经忘得差不多了,以前总觉得理解了记住了,但是发现真的好记性不如烂笔头,每一次得学习没有总结输出,基本等于没有学习.连复盘得机会都 ...

随机推荐

  1. 单片机开发——03工欲善其事必先利其器(AD软件安装破解)

    在单片机开发中,有了Keil的程序编程,Protues的模拟仿真,那么问题来了,怎么去进行电路图设计以及硬件调试呢?此刻就必须引入本文的Altium Designer (下文简称AD)安装与破解.在硬 ...

  2. VueJs 权限管理

    程序运行时,router只配置登陆 首页404 等基本页面 import Main from '@/views/Main.vue'; // 不作为Main组件的子页面展示的页面单独写,如下 expor ...

  3. Cookie、Session、jsp、EL、JSTL

      会话技术 Cookie Session 从访问一个站点,到关闭不继续访问 称为一次会话过程.会话技术就是记录本次会话中客户端的状态与数据的. 会话技术分为cookie.session. cooki ...

  4. ELK 架构之 Elasticsearch 和 Kibana 安装配置

    阅读目录: 1. ELK Stack 简介 2. 环境准备 3. 安装 Elasticsearch 4. 安装 Kibana 5. Kibana 使用 6. Elasticsearch 命令 最近在开 ...

  5. MyISAM和InnoDB的索引实现

    在 MySQL 中,主要有四种类型的索引,分别为: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引.我们主要分析B-Tree 索引. B-Tree 索引是 MyS ...

  6. PAT1112:Stucked Keyboard

    1112. Stucked Keyboard (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue On a ...

  7. java对象深复制、浅复制(深拷贝、浅拷贝)的理解

    先看一个例子 User user1 = new User(); user1.setId("111"); Map<String, User> map1 = new Has ...

  8. 网络IO和磁盘IO详解

    1. 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O.在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址 ...

  9. Spring Boot中使用Actuator的/info端点输出Git版本信息

    对于Spring Boot的Actuator模块相信大家已经不陌生了,尤其对于其中的/health./metrics等强大端点已经不陌生(如您还不了解Actuator模块,建议先阅读<Sprin ...

  10. Fastjson 专题

    JSONObject.toJSONString(Object object, SerializerFeature... features) SerializerFeature有用的一些枚举值 Quot ...