基本性质

每个结点最多有两棵子树,左子树和右子树,顺序不可颠倒。

非空二叉树第\(n\)层最多有\(2^{n-1}\)个元素。

深度为\(h\)的二叉树,至多有\(2^h-1\)个结点。

结点结构

class TreeNode {

int val;

TreeNode left;

TreeNode right;

TreeNode(int x) { val = x; }

}

二叉树的遍历

遍历即将树的所有结点都访问且仅访问一次。按照根结点访问次序的不同,可以分为前序遍历,中序遍历,后序遍历。

前序遍历:根结点 -> 左子树 -> 右子树

中序遍历:左子树 -> 根结点 -> 右子树

后序遍历:左子树 -> 右子树 -> 根结点

另外还有一种层次遍历,即每一层都从左向右遍历。

例如:求下图的二叉树的遍历

前序遍历:abdefgc

中序遍历:debgfac

后序遍历:edgfbca

层次遍历:abcdfeg

前序遍历

递归实现

List preorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

result.add(root.val);

result.addAll(preorderTraversal(root.left));

result.addAll(preorderTraversal(root.right));

return result;

}

非递归实现

List preorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

Stack stack = new Stack();

stack.push(root);

while (!stack.isEmpty()) {

TreeNode node = stack.pop();

result.add(node.val);

if (node.right != null)

stack.push(node.right);

if (node.left != null)

stack.push(node.left);

}

return result;

}

另一种实现方法:

List preorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

Stack stack = new Stack();

TreeNode p = root;

while (p != null || !stack.isEmpty()) {

if (p != null) {

result.add(p.val);

stack.push(p);

p = p.left;

} else {

p = stack.pop();

p = p.right;

}

}

return result;

}

中序遍历

递归实现

List inorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

result.addAll(inorderTraversal(root.left));

result.add(root.val);

result.addAll(inorderTraversal(root.right));

return result;

}

非递归实现

List inorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

Stack stack = new Stack();

TreeNode p = root;

while (p != null || !stack.isEmpty()) {

if (p != null) {

stack.push(p);

p = p.left;

} else {

p = stack.pop();

result.add(p.val);

p = p.right;

}

}

return result;

}

后序遍历

递归实现

List postorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

result.addAll(postorderTraversal(root.left));

result.addAll(postorderTraversal(root.right));

result.add(root.val);

return result;

}

非递归实现

List postorderTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

Stack stack = new Stack();

TreeNode p = root;

TreeNode last = null;

while (p != null || !stack.isEmpty()) {

if (p != null) {

stack.push(p);

p = p.left;

} else {

TreeNode peek = stack.peek();

if (peek.right != null && last != peek.right) {

p = peek.right;

} else {

peek = stack.pop();

result.add(peek.val);

last = peek;

}

}

}

return result;

}

层次遍历

List levelTraversal(TreeNode root) {

List result = new ArrayList();

if (root == null)

return result;

LinkedList queue = new LinkedList();

queue.addLast(root);

while (queue.size() != 0) {

TreeNode node = queue.pollFirst();

result.add(node.val);

if (node.left != null)

queue.addLast(node.left);

if (node.right != null)

queue.addLast(node.right);

}

return result;

}

html二叉树遍历,二叉树的遍历(前序、中序、后序、层次)相关推荐

  1. 二叉树的操作(前,中,后序遍历也叫深度优先遍历,非空结点的个数)递归实现

    定义一个二叉树的结点 二叉树的前序遍历, 先访问根结点,再访问左,再访问右. 每次访问都要先看根结点是否为空,然后打印根结点,把此时根结点的左结点作为下一次递归的根结点,当把左结点遍历完后,再遍历右结 ...

  2. 二叉树的前序中序后序遍历图示

    网上找了几张二叉树的图片,自己写了三种遍历的顺序,跟原文比较过,一致的 示例1 前序遍历: ABDXYCEGF 中序遍历: XDYBAGECF 后序遍历: XYDBGEFCA 示例2 前序遍历: AB ...

  3. 二叉树的前序中序后序遍历

    二叉树的前序中序后序遍历 二叉树的遍历 前序遍历 中序遍历 后序遍历 总结 二叉树的遍历 二叉树的遍历有前序遍历,中序遍历,后序遍历三种. 今天我把二叉树的遍历方法给大家总结一下,也算对我自己学习的一 ...

  4. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

  5. 二叉树的前序中序后序遍历java代码实现

    1.前序遍历概述 前序遍历(VLR) 是二叉树遍历的一种,也叫做先根遍历.先序遍历.前序周游,可记做根左右.前序遍历首先访问根结点然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: (1 ...

  6. 二叉树遍历(递归实现前序/中序/后序遍历)

    1. 准备工作 我们先定义一棵普通的二叉树,如下图 2. 前序遍历 通过递归进行遍历: 如果二叉树为空,则操作返回: 如果非空,否则从根结点开始,然后遍历左子树,再遍历右子树. 前序遍历的结果是:AB ...

  7. C++用类实现二叉树的创建,前序中序后序遍历(附完整代码)

    C++用类实现二叉树的创建,前序中序后序遍历(附完整代码) 前序.中序.后序遍历 直接上代码 前序.中序.后序遍历 二叉树的遍历分为前序遍历,中序遍历和后序遍历三种遍历方法.前序遍历的顺序为" ...

  8. 二叉树顺序存储-实现前序中序后序遍历

    一.顺序存储二叉树简介 二叉树的存储结构有两种,分别为顺序存储和链式存储. 二叉树的顺序存储,指的是使用顺序表(数组)存储二叉树.只有完全二叉树才可以使用顺序表存储.因此,如果我们想顺序存储普通二叉树 ...

  9. 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...

    二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...

  10. java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...

    224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...

最新文章

  1. python二维数组初始化
  2. 产品经理在工作中如何进行沟通
  3. 【技术解决方案】优化FFmpeg编码器参数设置
  4. prototype中的$R函数的用法
  5. 信用评分卡 (part 7 of 7)
  6. VS调试配置外网可访问
  7. 关于美颜滤镜您了解多少?
  8. java在regedit找不到_Windows找不到文件regedit打不开注册表的解决办法
  9. 实验项目一 俄罗斯方块游戏
  10. 4244. 【五校联考6day2】yi (Standard IO)
  11. 5G时代来临,电影行业面临的机遇与挑战
  12. 谷歌colab“几键”运行图像超分辨率模型-ESRGAN,操作详解
  13. java 四舍六入五成双_显示格式的四舍六入五成双
  14. 【matlab 图像处理】 guide 图像去雾系统
  15. java实现年会微信签到,签到后在大屏中展示,导出签到信息
  16. 使用zxing 解析图片中的二维码
  17. python练习实例——水仙花数判断
  18. 2022电大国家开放大学网上形考任务-桥梁工程技术非免费(非答案)
  19. 【论文阅读笔记】Automatic Liver and Lesion Segmentation in CT Using Cascaded Fully Convolutional Neural Net
  20. 笔记——数字图像基础

热门文章

  1. C语言标准库stdlib.h
  2. C开源hash代码uthash的用法总结(2)
  3. 三种强大的物体识别算法——SIFT/SURF、haar特征、广义hough变换的特性对比分析
  4. 4G通信技术LTE介绍
  5. requests爬取免费代理2
  6. iOS如何退出测试软件,如何继续测试iOS应用程序,使用UIAutomation仪器,甚至应用程序退出后?(How to c...
  7. python中、print程序设计基础输出是_在python编程里, print 4> 2 and 1 and 4 输出的是什么?...
  8. php熊掌号怎么设置json-ld,织梦DEDECMS熊掌号JSON LD结构化数据代码分享
  9. Graphics Driver 的编写
  10. Python Web框架Django学习(二)