遍历二叉树

一、基础知识

    1、 遍历二叉树概念:如何按某条搜索路径寻访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。

     2、遍历二叉树限定先左后右,则有三种情况先(根)序遍历,中(根)序遍历和后(根)序遍历

          先序遍历二叉树定义操作

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

               a、访问根节点

               b、先序遍历左子树

               c、先序遍历右子树

//先序遍历

void PreOrderTraverse(BiTree T) {
    if (T) {
        printf("%c",T->data);
        PreOrderTraverse(T->leftChild);
        PreOrderTraverse(T->rightChild);
    }
}

 

          中序遍历二叉树定义操作

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

               a、中序遍历左子树

               b、访问根结点

               c、中序遍历右子树

//中序遍历

void InOrderTraverse(BiTree T)
{
    if (T) {
       InOrderTraverse(T->leftChild);
         printf("%c",T->data);
        InOrderTraverse(T->rightChild);

    }
}

 

          后序遍历二叉树定义操作

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

               a、后序遍历左子树

               b、后序遍历右子树

               c、访问根结点

//后序遍历

void PostorderTraverse(BiTree T)
{
    if (T) {
        PostorderTraverse(T->leftChild);
        printf("%c",T->data);
        PostorderTraverse(T->rightChild);
    }
}

 

3、遍历实例

先序遍历:-+a*b-cd/ef;

中序遍历:a+b*c-d-e/f

后序遍历:abcd-*+ef/- 

时间: 2024-08-19 05:25:35

遍历二叉树的相关文章

数据结构教程 第二十四课 遍历二叉树

教学目的: 掌握二叉树遍历的三种方法 教学重点: 二叉树的遍历算法 教学难点: 中序与后序遍历的非递归算法 授课内容: 一.复习二叉树的定义 二叉树由三个基本单元组成:根结点.左子树.右子树 问题:如何不重复地访问二叉树中每一个结点? 二.遍历二叉树的三种方法: 先序 1 访问根结点 2 先序访问左子树 3 先序访问右子树 中序 1 中序访问左子树 2 中序访问根结点 3 中序访问右子树 后序 1 后序访问左子树 2 后序访问右子树 3 访问根结点 三.递归法遍历二叉树 先序: Status(P

先序遍历二叉树的递归实现与非递归实现深入解析

以下是对先序遍历二叉树的递归实现与非递归实现进行了详细的分析介绍,需要的朋友可以过来参考下   1.先序遍历二叉树  递归实现思想:若二叉树为空,返回.否则 1)遍历根节点: 2)先序遍历左子树: 3)先序遍历右子树: 代码: 复制代码 代码如下: template<typename elemType> void PreOrder(nodeType<elemType> *root)  {      if(root==NULL)          return ;      visi

中序遍历二叉树得到的序列是有序还是无序的?

问题描述 中序遍历二叉树得到的序列是有序还是无序的? 中序遍历二叉树得到的序列是有序还是无序的?中序遍历二叉树得到的序列是有序还是无序的? 解决方案 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树.在遍历左.右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树.排序二叉树的左边<中间<右边,所以是有序的.

有关后序非递归遍历二叉树的问题

问题描述 有关后序非递归遍历二叉树的问题 void show_LRD(tree LRD) { //后序非递归遍历二叉树 int otherstack[max];//辅助栈,用于检测出栈时是否已经遍历右子树 int *othertop,*otherbottom; tree temp; othertop=otherbottom=otherstack; while(LRD||!emptystack()) { while(LRD) { while(LRD) { inputstack(LRD); *oth

递归遍历二叉树,怎样保存结点数值到数组里

问题描述 递归遍历二叉树,怎样保存结点数值到数组里 求讲解 递归遍历二叉树的时候,怎样能 在访问每个结点时,将结点的数值存到数组里.最后得到一个结点数值的数组.教材上遍历的时候都是直接输出,没有存到数组里,但是我在编程时遇到了要存到数组里的问题.求大神~~~ 追问: 追问一下,我晚上试了一下,感觉使用数组作为参数看起来可以,但是在递归的时候每次递归数组的角标i都会被重新定义.貌似全局变量或者静态局部变量在递归时都会被重新定义.这怎么处理啊 好心塞 解决方案 将数组作为一个遍历函数的一个参数,遍历

中序遍历二叉树-二叉树的非递归操作。。

问题描述 二叉树的非递归操作.. 如何用栈实现二叉树的非递归操作,越详细越好,谢谢各位啦.一定要详细哦 解决方案 void inOrder2(BinTree *root) //非递归中序遍历 { stack<BinTree*> s; BinTree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); cout<<

@数据结构大神:递归遍历二叉树,建立树的代码 为什么错?

问题描述 @数据结构大神:递归遍历二叉树,建立树的代码 为什么错? //创建-输入-打印-递归 # include<stdio.h> # include<stdlib.h> # include<malloc.h> typedef struct Node{ char data; struct Node *Lchild; struct Node *Rchild; }BiTNode,*BiTree; BiTree CreateBiTree(BiTree bt) { char

java-为什么要遍历二叉树?遍历二叉树的算法一般能应用到哪里?

问题描述 为什么要遍历二叉树?遍历二叉树的算法一般能应用到哪里? 一般文件夹结构是n叉树,又不是二叉树,为什么要遍历二叉树呢? 解决方案 学习二叉树重点就是遍历算法,我们主要是要把遍历算法学会.随后可以应用到网络爬虫这些. 解决方案二: 二分查找元素的时候,就是二叉树. 解决方案三: 一般,在即时战略游戏中,对判定算法会有较高的时间性能要求 解决方案四: 一般,在即时战略游戏中,对判定算法会有较高的时间性能要求 解决方案五: 学习二叉树重点就是遍历算法,我们主要是要把遍历算法学会.随后可以应用到

深入遍历二叉树的各种操作详解(非递归遍历)_C 语言

先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序.中序.后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组队列,分别使用了front和rear两个数组的下标来表示入队与出队,还有两个操作就是求二叉树的深度.结点数... 复制代码 代码如下: #include<iostream>#include<queue>#include<stack>using namespace std;/