二叉树创建及遍历

声明:这篇文章是抄袭http://blog.csdn.net/sjf0115/article/details/8645991 请大家自己查看原博客

#include<iostream>
#include<stack>
#include<queue>
using namespace std;

//二叉树结点数据结构
typedef struct BiTNode
{
    char data;              //数据
    struct BiTNode * lchild;//左右孩子指针
    struct BiTNode * rchild;
}BiTNode, *BiTree;

//后序遍历(非递归)需要使用
typedef struct BiTNodePost{
    BiTree biTree;
    char tag;
}BiTNodePost, *BiTreePost;

int CreateBiTree(BiTree & root); //创建二叉树
void PreOrder(BiTree  root);     //先序遍历二叉树 递归
void InOrder(BiTree  root);      //中序遍历二叉树 递归
void PostOrder(BiTree  root);    //后序遍历二叉树 递归
void PreOrder2(BiTree  root);    //先序遍历二叉树 非递归
void InOrder2(BiTree  root);     //中序遍历二叉树 非递归
void PostOrder2(BiTree  root);   //中序遍历二叉树 非递归
void LevelOrder(BiTree root);    //层次遍历二叉树
int main()
{
    BiTree root = NULL;
    CreateBiTree(root);
    cout <<"\n先序遍历---递归"<<endl;
    PreOrder(root);
    cout << "\n先序遍历---非递归" << endl;
    PreOrder2(root);
    cout <<"\n中序遍历---递归" << endl;
    InOrder(root);
    cout << "\n中序遍历---非递归" << endl;
    InOrder2(root);
    cout << "\n后序遍历---递归" << endl;
    PostOrder(root);
    cout << "\n后序遍历---非递归" << endl;
    PostOrder2(root);
    cout << "\n层次遍历" << endl;
    LevelOrder(root);
    return 0;
}

/***********************
*函数功能:先序创建二叉树
*函数参数:二叉树的根节点
************************/
int CreateBiTree(BiTree & root)
{
    char data;
    cin >> data;
    if (‘#‘ == data)
        root = NULL;
    else
    {
        root = (BiTree)malloc(sizeof(BiTNode));
        root->data = data;
        CreateBiTree(root->lchild);
        CreateBiTree(root->rchild);
    }
    return 0;
}

/***********************
*函数功能:先序遍历二叉树(递归)
*函数参数:二叉树的根节点
************************/
void PreOrder(BiTree  root)
{
    if (NULL == root)
    {
        return;
    }
    else
    {
        cout << root->data << " ";
        PreOrder(root->lchild);
        PreOrder(root->rchild);
    }
}

/***********************
*函数功能:中序遍历二叉树(递归)
*函数参数:二叉树的根节点
************************/
void InOrder(BiTree  root)
{
    if (NULL == root)
    {
        return;
    }
    else
    {
        InOrder(root->lchild);
        cout << root->data << " ";
        InOrder(root->rchild);
    }
}
/***********************
*函数功能:后续遍历二叉树(递归)
*函数参数:二叉树的根节点
************************/
void PostOrder(BiTree  root)
{
    if (NULL == root)
    {
        return;
    }
    else
    {
        PostOrder(root->lchild);
        PostOrder(root->rchild);
        cout << root->data << " ";
    }
}
/***********************
*函数功能:先序遍历二叉树(非递归)
*函数参数:二叉树的根节点
*思路:访问root->data后,将T入栈,
*遍历左子树;
*遍历完左子树返回时,栈顶元素应为T,
*出栈,再先序遍历T的右子树。
************************/
void PreOrder2(BiTree root){
    stack<BiTree> stack;
    BiTree p = root; //p为移动指针
    while (!stack.empty() || p)
    {
        if (p)
        {
            cout << p->data << " ";
            stack.push(p);
            p = p->lchild;
        }
        else
        {
            p = stack.top();
            stack.pop();
            p = p->rchild;
        }
    }
}
/***********************
*函数功能:中序遍历二叉树(非递归)
*函数参数:二叉树的根节点
************************/
void InOrder2(BiTree root){
    stack<BiTree> stack;
    BiTree p = root; //p为移动指针
    while (!stack.empty() || p)
    {
        if (p)
        {
            stack.push(p);
            p = p->lchild;
        }
        else
        {
            p = stack.top();
            cout << p->data << " ";
            stack.pop();
            p = p->rchild;
        }
    }
}

/***************************
*函数功能:后序遍历二叉树(非递归)
*函数参数:二叉树的根节点
*思路:T是要遍历树的根指针,
后序遍历要求在遍历完左右子树后,
再访问根。
需要判断根结点的左右子树是否均遍历过。
****************************/
void PostOrder2(BiTree root)
{
    stack<BiTreePost> stack;
    BiTree p = root;        //p是遍历指针
    BiTreePost BT;

    while (p != NULL || !stack.empty())//栈不空或者p不空时循环
    {
        while (p != NULL)   //遍历左子树
        {
            BT = (BiTreePost)malloc(sizeof(BiTNodePost));
            BT->biTree = p;
            BT->tag = ‘L‘;      //访问过左子树
            stack.push(BT);
            p = p->lchild;
        }
        //左右子树访问完毕访问根节点
        while (!stack.empty() && (stack.top())->tag == ‘R‘)
        {
            BT = stack.top();
            //退栈
            stack.pop();
            BT->biTree;
            printf("%c ", BT->biTree->data);
        }

        if (!stack.empty())//遍历右子树
        {
            BT = stack.top();
            //访问过右子树
            BT->tag = ‘R‘;
            p = BT->biTree;
            p = p->rchild;
        }
    }//while
}
/***************************
*函数功能:层次遍历二叉树
*函数参数:二叉树的根节点
*思路:按从顶向下,
从左至右的顺序
来逐层访问每个节点,
层次遍历的过程中需要用队列。
****************************/
void LevelOrder(BiTree root)
{
    BiTree p = root;
    queue<BiTree> queue;
    queue.push(p);  //根节点入队
    //队列不空循环
    while (!queue.empty())
    {
        p = queue.front();//对头元素出队
        cout << p->data <<" ";//访问p指向的结点
        queue.pop();//退出队列
        //左子树不空,将左子树入队
        if (p->lchild != NULL)
        {
            queue.push(p->lchild);
        }
        //右子树不空,将右子树入队
        if (p->rchild != NULL)
        {
            queue.push(p->rchild);
        }
    }//while
}

测试输入:ABC##DE#G##F###

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 02:55:19

二叉树创建及遍历的相关文章

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

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

中序线索二叉树创建及其遍历

通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数.准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个.如下图所示. 因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点.这种指针称为线索. 记ptr指向二叉链表中的一个结点,以下是建立线索的规则: (1)如果ptr->lchild为空,则存放指向中序遍历序列中该结点的前驱结点.这个结点称为ptr的中序前驱: (2)如果ptr->rchild为空,则存放指向中序遍历

创建先序二叉树-创建层次遍历树

创建先序二叉树 #include<iostream> using namespace std; class BinTreeNode { public:     char ch;     BinTreeNode(int value){ch=value;}     BinTreeNode *left,*right; }; BinTreeNode* create_tree() {     char item;     BinTreeNode *t,*t_l,*t_r;     cin>>

二叉树学习一:二叉树创建与遍历

二叉树的遍历有三种方式: 1)先序遍历:若二叉树为空,则空操作:不为空,则先访问根结点,先序遍历左子树,先序遍历右子树. 2)后序遍历:若二叉树为空,则空操作:不为空,则中序遍历左子树,访问根结点,中序遍历右子树. 3)后序遍历:若二叉树为空,则空操作:不为空,则后序遍历左子树,后序遍历右子树,访问根结点. 例: 1)先序遍历结果为:ABDECF 2)中序遍历结果为:DBEAFC 3)后序遍历结果为:DEBFCA 二叉树输出的思想是将树转换成线性结构输出,一般采用递归方式,非递归方式是使用栈实现

二叉树创建、遍历

#include<iostream> #include <stdlib.h> #include<stdio.h> using namespace std; struct BinNode{ char data; struct BinNode *lchild,*rchild; }; BinNode * T; void creatBinTree(BinNode * &T); void Preorder(BinNode * &T); void Inorder(B

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

二叉树的创建与遍历

#include<iostream>using namespace std; typedef char ELEMTYPE; //二叉链表typedef struct BiTNode{ ELEMTYPE data; struct BiTNode *lChild; struct BiTNode *rChild; }BiTNode,*BiTPtr; //创建二叉树,使用前序遍历的方式输入数据void CreateBiTree(BiTPtr *T){ char c; scanf("%c&qu

二叉树的创建、遍历

二叉树的创建.这里采用最简单的情况,创建完全二叉树,用数组来保存: 1 struct TreeNode 2 { 3 int val; 4 TreeNode *left, *right; 5 TreeNode(int x): val(x), left(NULL), right(NULL) {}; 6 }; 7 8 void CreatTree(TreeNode *root, int idx, int A[], int n) //root结点已分配,idx为根结点的编号 9 { 10 if(2 *

Java实现二叉树的创建和遍历操作(有更新)

博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但是二者原理是一致的,而且实现的方式也是大同小异! 下面就让我们来看看代码吧. 1.首先我们需要创建一个二叉树的节点类,便于我们对树的操作,当然了,你也可以在二叉树类的内部将节点类声明为内部类,但是这样会降低操作的灵活性.我才用的是单独创建一个BinaryTreeNode类,代码如下: package