【数据结构】二叉树的遍历

  在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点进行某种处理。这就提出了遍历二叉树(traversing binary tree)的问题,即如何按某条路径巡访树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次。"访问"的含义很广,可以是对结点作各种处理,如输出结点的信息等。

  回顾二叉树的递归定义可知,二叉树由根结点、左子树和右子树三个单元组成。因此,遍历这三个单元就能遍历整个二叉树。下面介绍几种常见的二叉树遍历算法。

1. 先序遍历二叉树

  先序遍历二叉村的操作定义为:

  若二叉树为空,则空操作;否则:

  1. 访问根结点;

  2. 先序遍历左子树;

  3. 先序遍历右子树。

递归算法

void preOrderRecursion(BiTree T)
{
    if (T)
    {
        printf("%c ", T->data);
        preOrderRecursion(T->lchild);
        preOrderRecursion(T->rchild);
    }
}

非递归算法

  假设T是指向二叉树根结点的指针变量,非递归算法是:

  若二叉树为空,则返回;否则,令p=T

  1. 访问p所指向的结点;

  2. 令q=p->rchild,如果q不为空,则q进栈;

  3. 令p=p->lchild,如果p不为空,则转1, 否则转4;

  4. 退栈到p,转1,直到栈空为止。

  参考代码如下所示:

void preOrderIteration(BiTree T)
{
    stack<BiTree> st;
    st.push(T);
    while (!st.empty())
    {
        T = st.top();
        st.pop();
        printf("%c ", T->data);
        if (T->rchild) st.push(T->rchild);
        if (T->lchild) st.push(T->lchild);
    }
}

2. 中序遍历二叉树

  中序遍历二叉树的操作定义为:

  若二叉树为空,则空操作;否则:

  1. 中序遍历左子树;

  2. 访问根结点;

  3. 中序遍历右子树。

递归算法

void inOrderRecursion(BiTree T)
{
    if (T)
    {
        inOrderRecursion(T->lchild);
        printf("%c ", T->data);
        inOrderRecursion(T->rchild);
    }
}

非递归算法

  假设T是指向二叉树的根结点的指针变量,非递归算法是:

  若二叉树为空,则返回;否则,令p=T

  1. 若p不为空,则p进栈,p=p->lchild;

  2. 否则(即p为空),退栈到p,访问p所指向的结点;

  3. 令p=p->rchild,转1。

  参考代码如下所示:

void inOrderIteration(BiTree T)
{
    stack<BiTree> st;
    while (T || !st.empty())
    {
        if (T != NULL)
        {
            st.push(T);
            T = T->lchild;
        }
        else
        {
            T = st.top();
            st.pop();
            printf("%c ", T->data);
            T = T->rchild;
        }
    }
}

3. 后序遍历二叉树

  后序遍历二叉树的操作定义为:

  若二叉树为空,则空操作;否则:

  1. 后序遍历左子树;

  2. 后序遍历右子树;

  3. 访问根结点

递归算法

void postOrderRecursion(BiTree T)
{
    if (T)
    {
        postOrderRecursion(T->lchild);
        postOrderRecursion(T->rchild);
        printf("%c ", T->data);
    }
}

非递归算法

4. 层次遍历二叉树

  层次遍历二叉树,是从根结点开始遍历,按层次次序"自上而下,从左至右"访问树中的各个结点。

  为保证是按层次遍历,必须设置一个队列,初始化为空。设T是指向根结点的指针变量,层次遍历非递归算法是:

  若二叉树为空,则返回;否则令p=T,p入队:

  1. 队首元素出队到p;

  2. 访问p所指向的结点;

  3. 将p所指向的结点的左、右子结点依次入队。

  直到队空为止。

  参考代码如下所示:

时间: 2024-11-05 16:09:46

【数据结构】二叉树的遍历的相关文章

Java数据结构-二叉树及其遍历

二叉树的定义:n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互相不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点: 0<=度<=2: 左右子树是有顺序的,不能颠倒: 不论有几棵子树,也要区分它是左子树还是右子树. 二叉树的五种基本形态: 空二叉树: 只有一个根结点: 根结点只有左子树: 根结点只有右子树: 根结点既有左子树又有右子树. 举例3个结点的二叉树的形态有: 下面说一些特殊的二叉树. 斜树:所有的结点都只有左子树的二叉

数据结构——二叉树的遍历

"树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点,子节点有左右之分. 2)存储结构 二叉树的存储结构能够採用顺序存储,也能够採用链式存储,当中链式存储更加灵活. 在链式存储结构中,与线性链表类似,二叉树的每一个结点採用结构体表示,结构体包括三个域:数据域.左指针.右指针. 二叉树在C语言中的定义例如以下: struct BiTreeNode{ int c;

数据结构 - 二叉树的遍历

中序遍历二叉树 1 递归算法 算法的递归定义是: 若二叉树为空,则遍历结束:否则 ⑴ 中序遍历左子树(递归调用本算法): ⑵ 访问根结点: ⑶ 中序遍历右子树(递归调用本算法). 中序遍历的递归算法 void InorderTraverse(BTNode *T) { if (T==NULL) return: InorderTraverse(T->Lchild) ; visit(T->data) ; /* 访问根结点 */ InorderTraverse(T->Rchild) ; } 2

[转]数据结构 二叉树的遍历

/********************************************************************** 二叉树的基本操作 (1)二叉树的数据结构 (2)二叉树的构造 (3)二叉树遍历 :先序,中序,后序 ************************************************************************/ #include <cstdio> #include <cstdlib> const int

数据结构-二叉树的遍历(类C语言描写叙述)

遍历概念 所谓遍历(Traversal)是指沿着某条搜索路线.依次对树中每一个结点均做一次且仅做一次訪问.訪问结点所做的操作依赖于详细的应用问题. 遍历是二叉树上最重要的运算之中的一个,是二叉树上进行其他运算之基础. 遍历方案 1.遍历方案 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此.在任一给定结点上,能够按某种次序运行三个操作: (1)訪问结点本身(N), (2)遍历该结点的左子树(L), (3)遍历该结点的右子树(R). 以上三种操作有六种运行次序:

数据结构——二叉树层序遍历

层序遍历,即宽度优先遍历,在本算法中,我们还需要将每一层进行分开打印, 对于上图所示的二叉树,我们希望打印出的结果是: 1 2 3 4 5 6 7 8 首先,我们看一下二叉树节点是什么样的: class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } 具体实现中,我们采用last表示当前打印的行的最后一个元素的引用

数据结构——二叉树遍历之“递归与非递归遍历”

简述 二叉树的遍历分为先序遍历.中序遍历和后序遍历.如下图所示: 递归遍历 private void bianli1(List<Integer> list, TreeNode root) { // 先序遍历 if (root == null) { return; } list.add(root.val); bianli1(list, root.left); bianli1(list, root.right); } private void bianli2(List<Integer>

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

[数据结构]二叉树创建与遍历

实验报告:二叉树创建与遍历 一.问题描述 二叉树是一种实用范围很广的非线性结构,一棵非空二叉树有也只有一个根结点,每个结点最多有两个子树,我们称为左子树与右子树,当一个结点的左.右子树都是空的时,沃恩称此结点为叶子结点. 二叉树有一些很好的性质,这里不再赘述.考虑如何存储一棵树,本实验选择使用链式存储结构——二叉链表:如果事先知道需要存储的二叉树是满二叉树或者完全二叉树,则可以考虑使用顺序存储,否则将浪费大量的存储空间. 对于一棵既成的二叉树,有三种遍历方式——先序.中序与后序.可以证明,一棵形

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc