如何遍历二叉树

之前一直说有道题目要用到二叉树的定义以及遍历,所以一直都没写,这次先来说说二叉树的遍历。

对于二叉树的定义,以及二叉树的一些性质,在这里我就不多说了。

这次主要是说说怎么样去遍历一颗二叉树。

这里一共给出4种遍历的方式,然后给出思路,具体代码就不编写了,因为对于二叉树来说,不同的方式存放,代码差距还是很大的,所以理解思路就好。

1、前序遍历。

首先访问根节点,然后前序遍历左子树,再前序遍历右子树,遇到空就返回。

解释一下,在学习树的时候其实很多的时候会用到递归的思想,因为树本身的定义就是递归的。

这里的遍历的思想也是一样,也是递归的。

举个例子说明一下,一下几个遍历的思路参考这个例子的模型

首先来颗树

1

2     3

4  5  6  7

这棵树来说,先访问根节点1

然后前序遍历左子树,先访问根节点2

然后前序遍历左子树,先访问根节点4

然后前序遍历左子树,返回空

前序遍历右子树,返回空

前序遍历右子树,先访问根节点5

然后前序遍历左子树,返回空

前序遍历右子树,返回空

。。。。。依次下去,最后访问的过程为1245367

下面的遍历我就不多说明了,直接看最后遍历的结果吧。

2、中序遍历

先中序遍历左子树,再访问根节点,最后中序遍历右子树,遇到null返回

访问过程为4251637

3、后序遍历

先后序遍历左子树,在后序遍历右子树,最后访问根节点,遇到null返回

访问过程为4526731

4、层序遍历

按照层级结构,在访问第一层,再访问第二层,每一层从左往右一次访问

访问过程为1234567

我暂时只是列举出这几种遍历的方式,至于什么时候用到了,哪一种遍历方式适合当下的题目或者环境,这还有待思考和学习。

然后是对于遍历的转换,如果给出一长串数,说这是用中序遍历的结果,然后让你还原出那颗树,我觉得只要能懂原理的话,就不难了。

至于代码上的实现,基本上都是用递归来实现的,根据定义很容易给出,所以就不多写了。

时间: 2024-12-07 22:36:01

如何遍历二叉树的相关文章

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

非递归实现遍历二叉树

非递归实现二叉树主要利用queue和stack的特点,对于层次遍历二叉树主要运用queue队头出,队尾插入,先进先出的特点,先将根插入队尾,然后输出队头的元素,同时将队头的左子树和右子树元素插入队尾,依次输出输出队头的元素,同时将队头的左子树和右子树元素插入队尾,直到队列为空. void levelorder() { queue<BinaryTreeNode<T> *>s; if (_root == NULL) return; s.push(_root); while (!s.em

递归遍历二叉树

递归遍历分三种: 1.前序遍历二叉树(二叉树非空) 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 2.中序遍历二叉树(二叉树非空) 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 3.后序遍历二叉树(二叉树非空) 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点 三种递归的算法遍历,终止条件是二叉树为空的时候. 记忆的方法呢,前中后,都是以根节点命名的,前序,先访问根节点,中序,根节点在第二,后序,根节点最后进行访问.

TAOCP_2.3.1_遍历二叉树

1. 算法T(以中根序遍历二叉树) 设$T$是指向二叉树的指针:本算法以中根序访问二叉树中的所有节点,并且利用一个辅助栈A. T1. [初始化] 置栈A为空,并置链接变量$P \gets T$. T2. [$P=\bigwedge$?] 如果$P=\bigwedge$,转到步骤T4. T3. [$栈 \Leftarrow P$] (现在P指向要加以遍历的一个非空二叉树.)置 $A \Leftarrow P$:即是,把P的值放入栈A.然后置$P \to LLINK(P)$并返回步骤T2. T4.

数据结构(C实现)------- 遍历二叉树

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 二叉树是另一中树型结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒. 根据二叉树的的递归定义可知,二叉树是由3个基本单元组成,根结点.左子树和右子树,因此,若能依次遍历这三部分,便是遍历了整个二叉树.假如以L.D.R分别表示遍历左子树.访问根结点和遍历右子树,则可能有DLR.LDR.LRD.DRL.RD

非递归的方法遍历二叉树

//非递归遍历一棵树 需要借助栈 #include<stdio.h> #include<stdlib.h> struct Tree { int nValue; Tree *pLeft; Tree *pRight; }; struct Stack { Tree *root; Stack *pNext; }; Stack *pStack = NULL; void push(Tree *root) { Stack *temp = (Stack*)malloc(sizeof(Stack))

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改. 二.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>&g

史上最简明易懂非递归遍历二叉树算法

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 遍历二叉树的递归函数是体现了算法之美的高妙算法,思路清晰,代码简洁,读之赏心悦目.代码例如以下: 程序代码: void PreOrderTraverse_R(BiTree BT)//採用递归方式先序遍历二叉树BT { if(BT != NULL) { printf("%c", BT->data);//输出该结点(根结点) PreOrderTraverse_R(BT->lchi

SDUT 3341 数据结构实验之二叉树二:遍历二叉树

数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并按中序和后序的方式遍历该二叉树. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 每组输入数据对应输出2行:第1行输出中序遍历序列:第2行输出后序遍历序列

C++ 创建和遍历二叉树

一个简单的创建和遍历二叉树的C++程序,二叉树的其他操作程序待更新. #include <iostream> using namespace std; struct BiTNode{ char data; struct BiTNode *lchild, *rchild;//左右孩子 }; BiTNode*T; void CreateBiTree(BiTNode* &T); void Inorder(BiTNode* &T); void PreOrderTraverse(BiTN