【数据结构】二叉树遍历

先序遍历和中序遍历非递归代码:


#include <iostream>
#include <vector>
using namespace std;

typedef struct BinaryTree
{
int data;
struct BinaryTree *rchild, *lchild;
}BinaryTree;

int createBinaryTree( BinaryTree * &T) //必须用引用 因为内存是在函数里面分配的
{
int ch;
scanf("%d", &ch);

if(ch != 0)
{
T = (BinaryTree *)malloc(sizeof(BinaryTree));
T->data = ch;
createBinaryTree(T->lchild);
createBinaryTree(T->rchild);
}
else
{
T = NULL;
}
return 0;
}

int visit(int data)
{
printf("%d ", data);
return 0;
}

int PreOrderTraverse(BinaryTree T) //先序遍历
{
BinaryTree* p;
vector<BinaryTree *> Stack;
Stack.push_back(&T);
while(!Stack.empty())
{
while((p = Stack.back()) != NULL)
{
visit(p->data);
Stack.push_back(p->lchild);
}
Stack.pop_back();
if(!Stack.empty())
{
p = Stack.back();
Stack.pop_back();
Stack.push_back(p->rchild);
}
}
return 0;
}

int InOrderTraverse(BinaryTree T) //中序遍历
{
BinaryTree* p;
vector<BinaryTree *> Stack;
Stack.push_back(&T);
while(!Stack.empty())
{
while((p = Stack.back()) != NULL)
Stack.push_back(p->lchild);
Stack.pop_back();
if(!Stack.empty())
{
p = Stack.back();
Stack.pop_back();
visit(p->data);
Stack.push_back(p->rchild);
}

}
return 0;
}

int main()
{
BinaryTree * T = NULL;
createBinaryTree(T);
PreOrderTraverse(*T);
InOrderTraverse(*T);
return 0;
}

注意理清楚弹栈的机制。

时间: 2024-08-02 18:41:31

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

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

简述 二叉树的遍历分为先序遍历.中序遍历和后序遍历.如下图所示: 递归遍历 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>

数据结构——二叉树遍历之“层遍历”

系列文章:数据结构与算法系列——从菜鸟到入门 层次遍历 二叉树的层次遍历是指,从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中从左至右依次遍历. 设置一个队列,将二叉树的根结点放入队列中. 将队列中的头结点出队,赋值给临时变量 temp,同时输出打印 temp.val. 判断 temp 是否有左结点和右结点,若有,分别将左.右结点放入队列中. 重复步骤 2~3,直至队列为空,表示二叉树的层次遍历结束. private static void cengci(TreeNode root)

[javaSE] 数据结构二叉树-遍历与查找

%E7%AC%AC%E4%BA%8C%E5%B1%8APHP%E5%85%A8%E7%90%83%E5%BC%80%E5%8F%91%E8%80%85%E5%A4%A7%E4%BC%9A%E5%90%AB%E5%A4%A7%E4%BC%9A%E7%9A%84PPT http://auto.315che.com/bjqcbj20/qa23637830.htm?n2 http://auto.315che.com/haixingt22/qa23719692-2.htm http://auto.315c

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

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

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

数据结构之二叉树遍历

二叉树的 二叉树节点的描述 public class BiTNode { char data; BiTNode lc,rc; } 下面我们分别用递归和非递归实现前.中.后序遍历,以及使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组队列,分别使用了front和rear两个数组的下标来表示入队与出队. 1.前序遍历 未完待续... 数据结构之二叉树遍历,布布扣,bubuko.com

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

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

【自考】数据结构之二叉树遍历

什么是数据结构? 首先看看维基百科的定义:在计算机科学或信息科学中,数据结构(英语:data structure)是计算机中存储.组织数据的方式.通常情况下,精心选择的数据结构可以带来最优效率的算法. 课本中的定义:指一组相互之间存在一种或多种特定关系的数据的组织方式和它们在计算机中的存储方式,以及定义在该组数据上的一组操作. 有哪些内容?    直接看图了解数据结构的知识点,如下: 不管是算法还是逻辑结构,都是用数据说话的,所以要先明白了数据的基本概念.大的联系图中已给出,小的知识点需要我们去

采用栈数据结构的二叉树遍历

[前言]树的遍历,根据访问自身和其子节点之间的顺序关系,分为前序,后序遍历.对于二叉树,每个节点至多有两个子节点(特别的称为左,右子节点),又有中序遍历.由于树自身具有的递归性,这些遍历函数使用递归函数很容易实现,代码也非常简洁.借助于数据结构中的栈,可以把树遍历的递归函数改写为非递归函数. 在这里我思考的问题是,很显然,循环可以改写为递归函数.递归函数是否借助栈这种数据结构改写为循环呢.因为函数调用中,call procedure stack 中存储了流程的 context,调用和返回相当于根

(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. 可以和(编程训练)再回首,数据结构--二叉树的前序.中序.后序遍历(递归)对比着看 [问题描述] 根据顺序存储结构建立二叉树的二叉链表,并对二叉树进行先序.中序.后序遍历. [基本要求] ·功能:根据顺序存储结构建立二叉树的二叉链表,并进行先序.中序.后序遍历. ·输入:输入二叉树的顺序存储. ·输出:二叉树的先序.中序.后序遍历序