本文用递归算法实现二叉树的前序、中序和后序遍历,提供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. 记录一次坑爹的Python脚本抢购低价手机经历!

    无意间浏览到魅族官网,说魅族3限量100台.30号中午12点抢购.正好我爪机目前处于报废状态,就来一试手气了.11点多种,习惯性的看了下网页脚本,发现了检测是否到抢购时间,并返回抢购消息的ajax.于 ...

  2. node传统读取文件和promise,async await,

    先上传统文件加载方式代码,传统方式在处理多层嵌套时代码比较混乱 const fs = require('fs') //引入文件系统 function readFile (cb) { fs.readFi ...

  3. Unity3D学习(五):实现一个简单的视觉感知

    前言 在很多第一人称或者第三人称射击游戏的单人模式中,玩家的乐趣往往来源于和各式各样的AI敌人的战斗.而战斗的爆发很多时候是因为这些AI在"看见"玩家后就会立即做出反应,比如开火. ...

  4. redis常见重要性能指标数据分析和相关问题解决方案

    性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数 ...

  5. Linux时间子系统之(六):POSIX timer

    专题文档汇总目录 Notes:首先讲解了POSIX timer的标识(唯一识别).POSIX Timer的组织(管理POSIX Timer).内核中如何抽象POSIX Timer:然后分析了POSIX ...

  6. How to distribute a database among microservices

    在为相对复杂的企业域构建微服务时,我们需要找到在这个域中不同责任的边界.在每个边界中,我们会创建领域模型,这个模型是针对业务责任所设计的,并反映了这种业务责任.针对每个边界的数据模型会由同一个边界中的 ...

  7. Python使用Socket写一个简单聊天程序

    b2b模式的聊天工具 服务端: # 链接 while True: print('等待连接...') sock,adr = server_socket.accept() while True: try: ...

  8. 关于<input type="date">这种取值的问题 【原创】

    举例 <input type="date" id="date1"> var num = $("#date1").val(); a ...

  9. Golang 嵌套map赋值办法

    http://my.oschina.net/sol/blog/159060 m := map[string]map[string]string{} mm, ok := m["kkk" ...

  10. jdbc 链接数据库步骤 7步

    JDBC连接数据库   •创建一个以JDBC连接数据库的程序,包含7个步骤:   1.加载JDBC驱动程序:       在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), ...