`
bbls
  • 浏览: 63267 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现

阅读更多

后序遍历还没有明白,继续学习^_^,过几天写个huffman编码的例子来玩玩,不多说了,看代码吧,注意:程序申请的空间并没有释放^_^

/**//********************************************************************
    created:    2005/12/30
    created:    30:12:2005   10:39
    filename:     bintree.h
    author:        Liu Qi
    
    purpose:    二叉树的3种遍历方式(包括非递归实现),前序,后序和中序,先访问根节点就是
    前序(部分书籍称为先根遍历,个人觉得该说法更好^_^),类似的,最后访问根节点就是后序
********************************************************************
*/



#ifndef TREE_H
#define TREE_H


#include 
<stdio.h>
#include 
<malloc.h>
#include 
<stack>
#include 
<queue>
#include 
<assert.h>

using namespace std;



typedef 
int ElemType;

typedef 
struct treeT
{
    ElemType key;
    
struct treeT* left;
    
struct treeT* right;
}
treeT, *pTreeT;




/**//*===========================================================================
* Function name:    visit
* Parameter:        root:树根节点指针
* Precondition:        
* Description:        
* Return value:        
* Author:            Liu Qi, //-
===========================================================================
*/

static void visit(pTreeT root)
{
    
if (NULL != root)
    
{
        printf(
" %d\n", root->key);
    }

}




/**//*===========================================================================
* Function name:  BT_MakeNode    
* Parameter:      target:元素值    
* Precondition:      None    
* Postcondition:  NULL != pTreeT 
* Description:      构造一个tree节点,置左右指针为空,并且返回指向新节点的指针    
* Return value:      指向新节点的指针    
* Author:            Liu Qi,  [12/30/2005]
===========================================================================
*/

static pTreeT BT_MakeNode(ElemType target)
{
    pTreeT pNode 
= (pTreeT) malloc(sizeof(treeT));

    assert( NULL 
!= pNode ); 

    pNode
->key   = target;
    pNode
->left  = NULL;
    pNode
->right = NULL;
    
    
return pNode;
}



/**//*===========================================================================
* Function name:    BT_Insert
* Parameter:        target:要插入的元素值, pNode:指向某一个节点的指针
* Precondition:         NULL != ppTree 
* Description:        插入target到pNode的后面
* Return value:        指向新节点的指针
* Author:            Liu Qi,  [12/29/2005]
===========================================================================
*/

pTreeT BT_Insert(ElemType target, pTreeT
* ppTree)
{
    pTreeT Node;

    assert( NULL 
!= ppTree ); 

    Node 
= *ppTree;
    
if (NULL == Node)
    
{
        
return *ppTree = BT_MakeNode(target);
    }


    
if (Node->key == target)    //不允许出现相同的元素
    {
        
return NULL;
    }

    
else if (Node->key > target)    //向左
    {
        
return BT_Insert(target, &Node->left);
    }

    
else
    
{
        
return BT_Insert(target, &Node->right);
    }

}





/**//*===========================================================================
* Function name:    BT_PreOrder
* Parameter:        root:树根节点指针
* Precondition:        None
* Description:        前序遍历
* Return value:        void
* Author:            Liu Qi,  [12/29/2005]
===========================================================================
*/

void BT_PreOrder(pTreeT root)
{
    
if (NULL != root)
    
{
        visit(root);
        BT_PreOrder(root
->left);
        BT_PreOrder(root
->right);
    }
    
}



/**//*===========================================================================
* Function name:    BT_PreOrderNoRec
* Parameter:        root:树根节点指针
* Precondition:        Node
* Description:        前序(先根)遍历非递归算法
* Return value:        void
* Author:            Liu Qi,  [1/1/2006]
===========================================================================
*/

void BT_PreOrderNoRec(pTreeT root)
{
    stack
<treeT *> s;

    
while ((NULL != root) || !s.empty())
    
{
        
if (NULL != root)
        
{
            visit(root);
            s.push(root);
            root 
= root->left;
        }

        
else
        
{
            root 
= s.top();
            s.pop();
            root 
= root->right;
        }

    }

}




/**//*===========================================================================
* Function name:    BT_InOrder
* Parameter:        root:树根节点指针
* Precondition:        None
* Description:        中序遍历
* Return value:        void
* Author:            Liu Qi,  [12/30/2005]
===========================================================================
*/

void BT_InOrder(pTreeT root)
{
    
if (NULL != root)
    
{
        BT_InOrder(root
->left);
        visit(root);
        BT_InOrder(root
->right);
    }

}



/**//*===========================================================================
* Function name:    BT_InOrderNoRec
* Parameter:        root:树根节点指针
* Precondition:        None
* Description:        中序遍历,非递归算法
* Return value:        void
* Author:            Liu Qi,  [1/1/2006]
===========================================================================
*/

void BT_InOrderNoRec(pTreeT root)
{
    stack
<treeT *> s;
    
while ((NULL != root) || !s.empty())
    
{
        
if (NULL != root)
        
{
            s.push(root);
            root 
= root->left;
        }

        
else
        
{
            root 
= s.top();
            visit(root);
            s.pop();
            root 
= root->right;
        }

    }

}




/**//*===========================================================================
* Function name:    BT_PostOrder
* Parameter:        root:树根节点指针
* Precondition:        None
* Description:        后序遍历
* Return value:        void
* Author:            Liu Qi,  [12/30/2005]
===========================================================================
*/

void BT_PostOrder(pTreeT root)
{
    
if (NULL != root)
    
{
        BT_PostOrder(root
->left);
        BT_PostOrder(root
->right);
        visit(root);    
    }

}



/**//*===========================================================================
* Function name:    BT_PostOrderNoRec
* Parameter:        root:树根节点指针
* Precondition:        None
* Description:        后序遍历,非递归算法
* Return value:        void
* Author:            Liu Qi, //  [1/1/2006]
===========================================================================
*/

void BT_PostOrderNoRec(pTreeT root)
{
//学习中,尚未明白
}



/**//*===========================================================================
* Function name:    BT_LevelOrder
* Parameter:        root:树根节点指针
* Precondition:        NULL != root
* Description:        层序遍历
* Return value:        void
* Author:            Liu Qi,  [1/1/2006]
===========================================================================
*/

void BT_LevelOrder(pTreeT root)
{
    queue
<treeT *> q;
    treeT 
*treePtr;

    assert( NULL 
!= root ); 

    q.push(root);

    
while (!q.empty())
    
{
        treePtr 
= q.front();
        q.pop();
        visit(treePtr);

        
if (NULL != treePtr->left)
        
{
            q.push(treePtr
co
分享到:
评论

相关推荐

    二叉树 C++实现 建树 前序 中序 后序 层序

    本项目聚焦于使用C++语言实现二叉树的各种操作,包括构建、前序遍历、中序遍历、后序遍历以及层序遍历。下面将详细解释这些概念及其C++实现的关键点。 首先,二叉树是由节点构成的数据结构,每个节点最多有两个子...

    二叉树的遍历及通过前序中序遍历确定后序层序遍历

    然而,仅凭前序和中序遍历无法确定层序遍历,因为层序遍历涉及到树的层次结构,而前序和中序遍历无法提供这种信息。但可以通过构建出二叉树后再进行层序遍历来获取层序遍历的结果。 在实际应用中,二叉树遍历常用于...

    C++二叉树的前序,中序,后序,层序遍历的递归算法55555.docx

    常见的二叉树遍历方法有四种:前序遍历、中序遍历、后序遍历和层序遍历。 在本文中,我们将讨论C++语言实现的二叉树的前序、中序、后序、层序遍历的递归算法。我们将从二叉树的基本概念开始,逐步介绍四种遍历方法...

    已知二叉树的前序和中序遍历,打印后序遍历

    这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -&gt; 左子树 -&gt; 右子树 **中序遍历**:左子树 -&gt; 根节点 -&gt; 右子树 **后序遍历**:左子树 -&gt; 右子...

    完全二叉树 满二叉树 二叉树遍历(前序、中序、后序).pdf

    `PreOrderTraverse`函数实现了前序遍历,它首先访问根节点,然后递归地访问左子树和右子树,并打印出节点所在的层数。 总结来说,二叉树的遍历是理解和操作二叉树结构的关键,而满二叉树和完全二叉树是二叉树中的...

    二叉树的基本操作,前序遍历,中序遍历,后序遍历,层序遍历

    本篇将详细介绍二叉树的基本操作,包括前序遍历、中序遍历、后序遍历以及层序遍历。 **1. 二叉树的基本操作** 二叉树的基本操作主要包括创建、插入、删除节点以及遍历等。创建二叉树时,需要指定根节点,之后通过...

    二叉树遍历(先序,后序,中序,层序)

    二叉树遍历是计算机科学中处理树形数据结构的基本操作之一,对于理解和操作二叉树至关重要。在C/C++编程中,实现这些遍历方法是常见任务,它们分别是先序遍历、中序遍历、后序遍历以及层序遍历。以下是关于这四种...

    二叉树的遍历 二叉树的输出 递归和非递归实现 完美源代码 包括测试代码

    二叉树的遍历:前序,中序,后序,层序 包括 递归和非递归实现 包括测试代码 二叉树的输出 先找到最左边的叶子并把路上遇到的节点依次压栈,然后弹 出栈顶的元素(该元素为最左边的叶子),并判断(1)它 有没有右...

    二叉树的递归先序中序后序

    根据给定文件的信息,本文将详细介绍二叉树的创建及三种基本的递归遍历方法:先序遍历、中序遍历和后序遍历。 ### 一、二叉树的基本概念 二叉树是一种非线性数据结构,每个节点最多有两个子节点,通常称为左子节点...

    C++二叉树前序,中序,后序,按曾遍历

    二叉树遍历是访问二叉树中所有节点的过程,有三种主要的遍历方法:前序遍历、中序遍历和后序遍历。此外,还有一种层序遍历(按层遍历),但根据标题,这里主要讨论前三种。这些遍历方法在数据结构、算法和编译器设计...

    二叉树遍历_C语言_

    在这个场景中,我们关注的是使用C语言实现二叉树的遍历,包括先序遍历、中序遍历和后序遍历,以及非递归的中序遍历。这些遍历方法是理解二叉树特性和操作的关键。 1. **先序遍历**:先序遍历的顺序是根节点 -&gt; 左...

    数据结构(先中后序遍历)

    二叉树的遍历方法不仅限于以上介绍的几种,还有其他变种,比如前序非递归遍历、中序非递归遍历和后序非递归遍历。非递归遍历通常涉及栈或队列等数据结构,对于理解和实现复杂算法非常有帮助。 在实际编程中,理解...

    Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】

    本文将深入探讨Python中的二叉树及其遍历方法,包括前序遍历、中序遍历、后序遍历以及层序遍历。通过具体的代码示例,我们将更好地理解这些遍历方法的工作原理和应用场景。 #### 二、二叉树基础知识回顾 二叉树是由...

    二叉树遍历问题先序遍历、中序遍历和后序遍历等等最新详情介绍.docx

    以下提供了一段Java代码示例,展示了二叉树的前序、中序和后序遍历的递归和迭代版本的实现: ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } ...

    二叉树的遍历附上注释(先序,中序,后序,层序,递归与非递归)

    二叉树的遍历附上注释(先序,中序,后序,层序,递归与非递归)

    二叉树4种遍历方法的C语言实现

    本主题将详细介绍四种二叉树遍历方法的C语言实现:前序遍历、中序遍历、后序遍历以及层序遍历。 1. **前序遍历**: 前序遍历的顺序是根节点 -&gt; 左子树 -&gt; 右子树。在C语言中,我们可以递归地实现这个过程: - ...

    建立二叉树,层序、先序遍历( 用递归或非递归的方法都可以)

    总的来说,理解和掌握二叉树的构建与遍历是数据结构学习的基础,对于理解和实现各种算法具有重要意义。通过以上讨论,我们已经介绍了如何建立二叉树、进行层序遍历和前序遍历的方法,并提供了相关的Python代码示例。...

    LeetCode–144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)

    二叉树遍历是计算机科学中处理二叉树数据结构的一种基本操作,它涉及到对树的所有节点按照特定的顺序...对于二叉树遍历,熟练掌握递归和迭代的实现方式是编程面试中常见的要求,也是理解和操作二叉树所必备的基础技能。

    二叉树遍历

    在二叉树遍历中,我们按照特定的顺序访问树中的所有节点,主要分为三种基本遍历方法:前序遍历、中序遍历和后序遍历。 1. 前序遍历:前序遍历的顺序是根节点 -&gt; 左子树 -&gt; 右子树。这个过程可以递归地应用到每个...

    二叉树遍历问题-二叉树遍历问题

    二叉树遍历是计算机科学中的一个重要概念,主要应用于数据结构和算法领域。二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树遍历是指按照特定顺序访问二叉树的所有...

Global site tag (gtag.js) - Google Analytics