二叉树的遍历

遍历方案

  从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

  ⑴访问结点本身(N),

  ⑵遍历该结点的左子树(L),

  ⑶遍历该结点的右子树(R)。

  以上三种操作有六种执行次序:

  NLR、LNR、LRN、NRL、RNL、RLN。

  注意:

  前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。

三种遍历的命名

  根据访问结点操作发生位置命名:

  ① NLR:前序遍历(PreorderTraversal亦称(先序遍历))

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

  ② LNR:中序遍历(InorderTraversal)

  ——访问根结点的操作发生在遍历其左右子树之中(间),它也被叫做“对称序列”。

  ③ LRN:后序遍历(PostorderTraversal)

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

  注意:

  由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

遍历算法

  1.中序遍历的递归算法定义:

  若二叉树非空,则依次执行如下操作:

  ⑴遍历左子树;

  ⑵访问根结点;

  ⑶遍历右子树。

  2.先序遍历的递归算法定义:

  若二叉树非空,则依次执行如下操作:

  ⑴ 访问根结点;

  ⑵ 遍历左子树;

  ⑶ 遍历右子树。

  3.后序遍历得递归算法定义:

  若二叉树非空,则依次执行如下操作:

  ⑴遍历左子树;

  ⑵遍历右子树;

  ⑶访问根结点。

  4.层次遍历

 

前序(Pre-order Traversal)、中序(In-order Traversal)、后序遍历(Post-orderTraversal)和深度优先搜索的顺序类似,层序遍历(Level-order Traversal)和广度优先搜索的顺序类似。
前序和中序遍历的结果合在一起可以唯一确定二叉树的形态,也就是说根据遍历结果可以构造出二叉树。

时间: 2024-07-28 13:56:01

二叉树的遍历的相关文章

UVa 11234 Expressions:二叉树 层次遍历 广搜

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=2175 题目类型: 数据结构, 二叉树 题目大意: 一般情况下,都是中缀操作符, 如x+y.然后题目给出了一种后缀操作符的形式, 变成 x y +. 进行后缀操作可以用栈模拟,使用push,pop, 过程和经典的"括号匹配"差不

一步一步写算法(之二叉树深度遍历)

原文:一步一步写算法(之二叉树深度遍历) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]     深度遍历是软件开发中经常遇到的遍历方法.常用的遍历方法主要有下面三种:(1)前序遍历:(2)中序遍历:(3)后序遍历.按照递归的方法,这三种遍历的方法其实都不困难,前序遍历就是根-左-右,中序遍历就是左-根-右,后续遍历就是左-右-根.代码实现起来也不复杂.     1)前序遍历 void preorder_traverse(TREE_NOD

[算法系列之二]二叉树各种遍历

[简介] 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:深度为k的二叉树至多有2^(k) -1个结点:对任何一棵二叉树T,

c语言-求助关于二叉树层次遍历

问题描述 求助关于二叉树层次遍历 向各位前辈求助..... 小弟研究二叉树层次遍历三天了,始终不能结合队列写出可执行的代码....真心求教....万分感谢.....!!!! void Printbylevel(BTree T) { BNode *tmp = T; CircleQueue *q = malloc(sizeof(CircleQueue)); Init(q); if(T == NULL) { return ;//根节点为空,返回-1 } else { InQueue(q, tmp);/

[LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS | BFS)

目录:1.Binary Tree Level Order Traversal - 二叉树层次遍历 BFS 2.Binary Tree Level Order Traversal II - 二叉树层次遍历从低往高输出 BFS 3.Maximum Depth of Binary Tree - 求二叉树的深度 DFS4.Balanced Binary Tree - 判断平衡二叉树 DFS5.Path Sum - 二叉树路径求和判断DFS 题目概述:Given a binary tree, return

某研究院的二叉树深度优先遍历变种的算法面试题以及答案

  去了某研究院面试,被面了一道算法题,觉得有点意思,所以写下来供后人参考. 题目是这样子的: 给定二叉树,二叉树的每个节点都是一个整数值,求从叶子节点到根节点的和为某数的所有路径 例如下图中,要求叶子节点到根节点的值和为14的路径为: 3,6,53,7,4 这道题考的是二叉树深度优先遍历的增强版,其实现代码如下: package cn.outofmemory; import java.util.Stack; public class TreeSum { public static void m

指针-各位前辈帮我看看二叉树层序遍历错在哪里了

问题描述 各位前辈帮我看看二叉树层序遍历错在哪里了 #include #include struct Nodep /*树结点类型*/ { char data; struct Nodep * lired; //左孩子 struct Nodep * rired; //右孩子 }; struct Queue //队列结点 { Nodep * ch; struct Queue * next; }; struct BQueue //队列指针 { Queue * rear; //队尾指针 Queue * f

数据结构的C++实现之二叉树的遍历和存储结构

在<二叉树的定义和性质>中我们已经认识了二叉树这种数据结构.我们知道链表的每个节点可以有一个后继,而二叉 树(Binary Tree)的每个节点可以有两个后继.比如这样定义二叉树的节点: typedef struct node *link; struct node { unsigned char item; link l, r; }; 这样的节点可以组织成 下图所示的形态. 二叉树可以这样递归地定义: 1. 就像链表有头指针一样,每个二叉树都有一个根指针(上图中的root指针)指向它 .根指针

C#与数据结构--二叉树的遍历

二叉树的存储结构 二叉树的存储可分为两种:顺序存储结构和链式存储结构. 1.顺序存储结构 把一个满二叉树自上而下.从左到右顺序编号,依次存放在数组内,可得到图6.8(a)所示的结果.设满二叉树结点在数组中的索引号为i,那么有如下性质. (1)如果i = 0,此结点为根结点,无双亲. (2)如果i > 0,则其双亲结点为(i -1) / 2 .(注意,这里的除法是整除,结果中的小数部分会被舍弃.) (3)结点i的左孩子为2i + 1,右孩子为2i + 2. (4)如果i > 0,当i为奇数时,它