html二叉树遍历,二叉树的遍历(前序、中序、后序、层次)
基本性质
每个结点最多有两棵子树,左子树和右子树,顺序不可颠倒。
非空二叉树第\(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 前序遍历: ABDXYCEGF 中序遍历: XDYBAGECF 后序遍历: XYDBGEFCA 示例2 前序遍历: AB ...
- 二叉树的前序中序后序遍历
二叉树的前序中序后序遍历 二叉树的遍历 前序遍历 中序遍历 后序遍历 总结 二叉树的遍历 二叉树的遍历有前序遍历,中序遍历,后序遍历三种. 今天我把二叉树的遍历方法给大家总结一下,也算对我自己学习的一 ...
- 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法
本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...
- 二叉树的前序中序后序遍历java代码实现
1.前序遍历概述 前序遍历(VLR) 是二叉树遍历的一种,也叫做先根遍历.先序遍历.前序周游,可记做根左右.前序遍历首先访问根结点然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: (1 ...
- 二叉树遍历(递归实现前序/中序/后序遍历)
1. 准备工作 我们先定义一棵普通的二叉树,如下图 2. 前序遍历 通过递归进行遍历: 如果二叉树为空,则操作返回: 如果非空,否则从根结点开始,然后遍历左子树,再遍历右子树. 前序遍历的结果是:AB ...
- C++用类实现二叉树的创建,前序中序后序遍历(附完整代码)
C++用类实现二叉树的创建,前序中序后序遍历(附完整代码) 前序.中序.后序遍历 直接上代码 前序.中序.后序遍历 二叉树的遍历分为前序遍历,中序遍历和后序遍历三种遍历方法.前序遍历的顺序为" ...
- 二叉树顺序存储-实现前序中序后序遍历
一.顺序存储二叉树简介 二叉树的存储结构有两种,分别为顺序存储和链式存储. 二叉树的顺序存储,指的是使用顺序表(数组)存储二叉树.只有完全二叉树才可以使用顺序表存储.因此,如果我们想顺序存储普通二叉树 ...
- 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...
二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...
- java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...
224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...
最新文章
- python二维数组初始化
- 产品经理在工作中如何进行沟通
- 【技术解决方案】优化FFmpeg编码器参数设置
- prototype中的$R函数的用法
- 信用评分卡 (part 7 of 7)
- VS调试配置外网可访问
- 关于美颜滤镜您了解多少?
- java在regedit找不到_Windows找不到文件regedit打不开注册表的解决办法
- 实验项目一 俄罗斯方块游戏
- 4244. 【五校联考6day2】yi (Standard IO)
- 5G时代来临,电影行业面临的机遇与挑战
- 谷歌colab“几键”运行图像超分辨率模型-ESRGAN,操作详解
- java 四舍六入五成双_显示格式的四舍六入五成双
- 【matlab 图像处理】 guide 图像去雾系统
- java实现年会微信签到,签到后在大屏中展示,导出签到信息
- 使用zxing 解析图片中的二维码
- python练习实例——水仙花数判断
- 2022电大国家开放大学网上形考任务-桥梁工程技术非免费(非答案)
- 【论文阅读笔记】Automatic Liver and Lesion Segmentation in CT Using Cascaded Fully Convolutional Neural Net
- 笔记——数字图像基础
热门文章
- C语言标准库stdlib.h
- C开源hash代码uthash的用法总结(2)
- 三种强大的物体识别算法——SIFT/SURF、haar特征、广义hough变换的特性对比分析
- 4G通信技术LTE介绍
- requests爬取免费代理2
- iOS如何退出测试软件,如何继续测试iOS应用程序,使用UIAutomation仪器,甚至应用程序退出后?(How to c...
- python中、print程序设计基础输出是_在python编程里, print 4> 2 and 1 and 4 输出的是什么?...
- php熊掌号怎么设置json-ld,织梦DEDECMS熊掌号JSON LD结构化数据代码分享
- Graphics Driver 的编写
- Python Web框架Django学习(二)