后序遍历还没有明白,继续学习^_^,过几天写个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(treePtrco
分享到:
相关推荐
本项目聚焦于使用C++语言实现二叉树的各种操作,包括构建、前序遍历、中序遍历、后序遍历以及层序遍历。下面将详细解释这些概念及其C++实现的关键点。 首先,二叉树是由节点构成的数据结构,每个节点最多有两个子...
然而,仅凭前序和中序遍历无法确定层序遍历,因为层序遍历涉及到树的层次结构,而前序和中序遍历无法提供这种信息。但可以通过构建出二叉树后再进行层序遍历来获取层序遍历的结果。 在实际应用中,二叉树遍历常用于...
常见的二叉树遍历方法有四种:前序遍历、中序遍历、后序遍历和层序遍历。 在本文中,我们将讨论C++语言实现的二叉树的前序、中序、后序、层序遍历的递归算法。我们将从二叉树的基本概念开始,逐步介绍四种遍历方法...
这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -> 左子树 -> 右子树 **中序遍历**:左子树 -> 根节点 -> 右子树 **后序遍历**:左子树 -> 右子...
`PreOrderTraverse`函数实现了前序遍历,它首先访问根节点,然后递归地访问左子树和右子树,并打印出节点所在的层数。 总结来说,二叉树的遍历是理解和操作二叉树结构的关键,而满二叉树和完全二叉树是二叉树中的...
本篇将详细介绍二叉树的基本操作,包括前序遍历、中序遍历、后序遍历以及层序遍历。 **1. 二叉树的基本操作** 二叉树的基本操作主要包括创建、插入、删除节点以及遍历等。创建二叉树时,需要指定根节点,之后通过...
二叉树遍历是计算机科学中处理树形数据结构的基本操作之一,对于理解和操作二叉树至关重要。在C/C++编程中,实现这些遍历方法是常见任务,它们分别是先序遍历、中序遍历、后序遍历以及层序遍历。以下是关于这四种...
二叉树的遍历:前序,中序,后序,层序 包括 递归和非递归实现 包括测试代码 二叉树的输出 先找到最左边的叶子并把路上遇到的节点依次压栈,然后弹 出栈顶的元素(该元素为最左边的叶子),并判断(1)它 有没有右...
根据给定文件的信息,本文将详细介绍二叉树的创建及三种基本的递归遍历方法:先序遍历、中序遍历和后序遍历。 ### 一、二叉树的基本概念 二叉树是一种非线性数据结构,每个节点最多有两个子节点,通常称为左子节点...
二叉树遍历是访问二叉树中所有节点的过程,有三种主要的遍历方法:前序遍历、中序遍历和后序遍历。此外,还有一种层序遍历(按层遍历),但根据标题,这里主要讨论前三种。这些遍历方法在数据结构、算法和编译器设计...
在这个场景中,我们关注的是使用C语言实现二叉树的遍历,包括先序遍历、中序遍历和后序遍历,以及非递归的中序遍历。这些遍历方法是理解二叉树特性和操作的关键。 1. **先序遍历**:先序遍历的顺序是根节点 -> 左...
二叉树的遍历方法不仅限于以上介绍的几种,还有其他变种,比如前序非递归遍历、中序非递归遍历和后序非递归遍历。非递归遍历通常涉及栈或队列等数据结构,对于理解和实现复杂算法非常有帮助。 在实际编程中,理解...
本文将深入探讨Python中的二叉树及其遍历方法,包括前序遍历、中序遍历、后序遍历以及层序遍历。通过具体的代码示例,我们将更好地理解这些遍历方法的工作原理和应用场景。 #### 二、二叉树基础知识回顾 二叉树是由...
以下提供了一段Java代码示例,展示了二叉树的前序、中序和后序遍历的递归和迭代版本的实现: ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } ...
二叉树的遍历附上注释(先序,中序,后序,层序,递归与非递归)
本主题将详细介绍四种二叉树遍历方法的C语言实现:前序遍历、中序遍历、后序遍历以及层序遍历。 1. **前序遍历**: 前序遍历的顺序是根节点 -> 左子树 -> 右子树。在C语言中,我们可以递归地实现这个过程: - ...
总的来说,理解和掌握二叉树的构建与遍历是数据结构学习的基础,对于理解和实现各种算法具有重要意义。通过以上讨论,我们已经介绍了如何建立二叉树、进行层序遍历和前序遍历的方法,并提供了相关的Python代码示例。...
二叉树遍历是计算机科学中处理二叉树数据结构的一种基本操作,它涉及到对树的所有节点按照特定的顺序...对于二叉树遍历,熟练掌握递归和迭代的实现方式是编程面试中常见的要求,也是理解和操作二叉树所必备的基础技能。
在二叉树遍历中,我们按照特定的顺序访问树中的所有节点,主要分为三种基本遍历方法:前序遍历、中序遍历和后序遍历。 1. 前序遍历:前序遍历的顺序是根节点 -> 左子树 -> 右子树。这个过程可以递归地应用到每个...
二叉树遍历是计算机科学中的一个重要概念,主要应用于数据结构和算法领域。二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树遍历是指按照特定顺序访问二叉树的所有...