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

简介: 数据结构— — 二叉树的遍历

🎯目的:

1、掌握二叉树的特点及其存储方式。

2、掌握二叉树的创建

3、掌握二叉树前序、中序、后序遍历的基本方法及应用。


🎯内容:

1、用前序方法建立一棵二叉树。

2、编写前序遍历二叉树的程序。

3、编写中序遍历二叉树的程序。

4、编写后序遍历二叉树的程序。

5、编写程序实现二叉树中的一些基本操作。


🎯环境:

TC或VC++。


🎯步骤:

1、二叉树的二叉链表存储类型定义:

typedef struct BiTNode
 
{
 
datatype  data;
 
struct BiTNode *lchild ,*rchild ;
 
} BiTNode,*BiTree;


2、使用先序遍历建立下图所示的二叉树:      


3、编程实现以上二叉树的前序、中序和后序遍历操作,并输出遍历序列:

(1)先序遍历二叉树并输出遍历序列(ABCDEGF);

(2)中序遍历二叉树并输出遍历序列(CBEGDFA);

(3)后序遍历二叉树并输出遍历序列(CGEFDBA)。

4、计算二叉树的深度:

算法基本思想:

递归计算左子树的深度记为m;递归计算右子树的深度记为n;如果m大于n,二叉树的深度为m+1,否则为n+1。

5、统计二叉树中结点的总数:

算法基本思想:

如果是空树,则结点个数为0;结点个数为左子树的结点个数+右子树的结点个数再+1。

6、统计二叉树中叶子结点的个数:

算法基本思想:

先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点” 的操作改为:若是叶子,则计数器增1。


7、在主函数中实现相关函数的调用。

#include <iostream>
 
using namespace std;
 
typedef struct BiTNode{//定义二叉树
 
       char data;
 
       struct BiTNode *lchild,*rchild;
 
}BiTNode,*BiTree;
 
void CreateBiTree(BiTree &T){//先序遍历二叉树
 
       char ch;
 
       cin>>ch;
 
       if(ch=='#')
 
              T=NULL;//结束,空树;
 
       else{
 
              T=new BiTNode;
 
              T->data=ch;
 
              CreateBiTree(T->lchild);
 
              CreateBiTree(T->rchild);
 
       }
 
}
 
void PreOrderTraverse(BiTree T){//先序遍历输出
 
       if(T){
 
              cout<<T->data;
 
              PreOrderTraverse(T->lchild);
 
              PreOrderTraverse(T->rchild);
 
       }
 
}
 
void InOrderTraverse(BiTree T){//中序遍历输出
 
       if(T){
 
              InOrderTraverse(T->lchild);
 
              cout<<T->data;
 
              InOrderTraverse(T->rchild);
 
       }
 
}
 
void PostOrderTraverse(BiTree T){//后序遍历输出
 
       if(T){
 
              PostOrderTraverse(T->lchild);
 
              PostOrderTraverse(T->rchild);
 
              cout<<T->data;
 
       }
 
}
 
int Depth(BiTree T){//计算深度
 
       int m,n;
 
       if(T==NULL)
 
              return 0;//空树,深度为0
 
       else
 
       {
 
              m=Depth(T->lchild);
 
              n=Depth(T->rchild);
 
              if(m>n)
 
                     return m+1;
 
              else{
 
                     return n+1;
 
              }
 
       }
 
}
 
int NodeCount(BiTree T){//总结点
 
       if(T==NULL){
 
              return 0;
 
       }
 
       else
 
              return  NodeCount(T->lchild)+ NodeCount(T->rchild)+1;
 
             
 
}
 
int LeafCount(BiTree T){//叶子节点
 
       if(T==NULL)
 
              return 0;
 
       if(T->rchild==NULL&&T->lchild==NULL){
 
              return 1;
 
       }
 
       else{
 
              return LeafCount(T->lchild)+LeafCount(T->rchild);
 
       }
 
}
 
int main(){
 
       BiTree t;
 
       cout<<"请输入所要建立的二叉树的序列:"<<endl;
 
       cout<<"提示:先序为:(ABC##DE#G##F###)"<<endl;
 
       CreateBiTree(t);
 
       cout<<endl;
 
       cout<<"先序遍历输出为:"<<endl;
 
       PreOrderTraverse(t);
 
       cout<<endl;
 
       cout<<"中序遍历输出为:"<<endl;
 
       InOrderTraverse(t);
 
       cout<<endl;
 
       cout<<"后序遍历输出为:"<<endl;
 
       PostOrderTraverse(t);
 
       cout<<endl;
 
       cout<<"二叉树的深度为:"<<endl;
 
       cout<<Depth(t)<<endl;
 
       cout<<"二叉树的总结点为:"<<endl;
 
       cout<<NodeCount(t)<<endl;
 
       cout<<"二叉树的叶子节点为:"<<endl;
 
       cout<<LeafCount(t)<<endl;
 
       return 0;
 
}


[附加题]

哈夫曼树的构造:

根据给定的N个权值{7,6,3,5}建立哈夫曼树,并输出终态表查看构造结果。

终态表:

序号

权值

parent

lchild

rchild

1

7

6

0

0

2

6

6

0

0

3

3

5

0

0

4

5

5

0

0

5

8

7

3

4

6

13

7

2

1

7

21

0

5

6



🎯 结果:

#include <iostream>
using namespace std;
typedef struct{
  int weight;
  int parent,lchild,rchild;
}HTNode,*HuffmanTree;
void Select(HuffmanTree HT,int x,int &s1,int &s2); 
void CreateHuffmanTree(HuffmanTree &HT,int n){
  if(n<=1)
    return;
  int m=2*n-1;
  HT=new HTNode[m+1];//0号不用 
  for(int i=1;i<=m;i++){//初始化 
    HT[i].parent=0;
    HT[i].lchild=0;
    HT[i].rchild=0;
  }
  cout<<"输入哈夫曼树的权值(用空格隔开):"<<endl;
  for(int i=1;i<=n;i++){//输入叶子结点的权值 
    cin>>HT[i].weight;  
  }
  int s1,s2,i;  
  for(i=n+1;i<=m;i++){
    Select(HT,i-1,s1,s2);
    HT[s1].parent=i;
    HT[s2].parent=i; 
    HT[i].lchild=s1;
    HT[i].rchild=s2;
    HT[i].weight=HT[s1].weight+HT[s2].weight;
  }
}
void Select(HuffmanTree HT,int x,int &s1,int &s2){
  int min1=100000;
  for(int k=1;k<=x;k++){
    if(HT[k].parent==0&&HT[k].weight<min1){
      min1=HT[k].weight;
      s1=k;
    }
  }
//  HT[s1].weight=100000000;
  HT[s1].parent=1;
  int min2=1000000;
  for(int k=1;k<=x;k++){
    if(HT[k].parent==0&&HT[k].weight<min2){
      min2=HT[k].weight;
      s2=k;
    }
  }
//  HT[s1].weight=min1;
  HT[s1].parent=0;
}
int main(){
  HuffmanTree ht;
  int n=4;
  CreateHuffmanTree(ht,n);
  printf("终态表如下:\n序号 权值 parent lchild rchild \n");
  for(int i=1;i<=2*n-1;i++){
  printf(" %2d   %2d    %2d    %2d    %2d \n",i,ht[i].weight,ht[i].parent,ht[i].lchild,ht[i].rchild);
  }
}
相关文章
|
7月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
201 10
 算法系列之数据结构-二叉树
|
9月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
191 12
|
9月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
168 10
|
9月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
267 3
|
10月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
9月前
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
333 0
|
11月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
266 4
|
11月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
700 8
|
12月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
138 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
12月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
221 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树