二叉树的定义和存储结构

电脑杂谈  发布时间:2020-04-06 17:05:57  来源:网络整理

二叉树的深度怎么算_二叉树_树与二叉树的区别

二叉树的定义:

二叉树是n个节点的有限集合. 该集合可以是一个空集合或一个根节点,还有两个不相交的二叉树二叉树,分别称为根节点组成的左右子树.

二叉树有五种基本形式:

空的二叉树. 只有一个根节点. 根节点仅是左子树. 根节点只有正确的子树.

特殊的二叉树

斜方树. 到处都是二叉树. 完全是二叉树.

二叉树的顺序存储结构:

二叉树的深度怎么算_二叉树_树与二叉树的区别

二叉树的顺序存储结构是使用一维数组将节点存储在二叉树中,并且节点的存储位置二叉树,即数组的下标应反映之间的逻辑关系节点,例如父母与子女的关系,兄弟之间的关系.

使用顺序存储结构表示二叉树时,其线性结构中会有一些空节点,但会占用一定数量的存储空间,这会浪费存储空间;因此,顺序存储结构通常仅用于完全二叉树.

二叉树的链存储结构:

由于二叉树的每个节点最多具有两个子节点,因此为每个节点设计了一个数据字段和两个指针字段,通常称为二进制链接列表.

用于定义二进制链接列表的节点结构的代码:

  1. typedef char TElemType; 
  2. typedef struct BinaryTreeNode{ 
  3.     TElemType data;     
  4.     //lchild指向左结点的指针 
  5.     //rchild指向右结点的指针 
  6.     struct BinaryTreeNode *lchild,*rchild; 
  7. }BinaryTreeNode,*BinaryTree; 

二叉树遍历

遍历二叉树意味着从根节点开始,并以一定顺序一次访问二叉树中的所有节点,以便每个节点只能访问一次.

树与二叉树的区别_二叉树的深度怎么算_二叉树

二叉树的遍历方法:

预遍历,顺序遍历和后遍历

1. 首先创建一个二叉树

构建一个二叉树,将字符添加到节点的数据字段中.

  1. void CreateBinaryTree(BinaryTree *T){ 
  2.     TElemType ch;     
  3.     cin>>ch;     
  4.     if (ch=='$'){ 
  5.         *T=NULL; 
  6.     }else{ 
  7.         *T=new BinaryTreeNode;         
  8.         if (!*T)return; 
  9.         (*T)->data=ch; 
  10.         CreateBinaryTree(&(*T)->lchild); 
  11.         CreateBinaryTree(&(*T)->rchild); 
  12.     } 
  13. } 

2. 二叉树的遍历遍历算法

  1. void PreOrderTraverse(BinaryTree T){     
  2. if (T==NULL){         
  3.     cout<<"#"<<"  ";         
  4.         return; 
  5.     }     
  6.     cout<<T->data<<"  "; 
  7.     PreOrderTraverse(T->lchild); 
  8.     PreOrderTraverse(T->rchild); 
  9. } 

3. 二叉树的中阶遍历算法

二叉树的深度怎么算_树与二叉树的区别_二叉树

  1. void InOderTraverse(BinaryTree T){     
  2. if(T!=NULL){         
  3.         cout<<"#"<<"  ";         
  4.         return; 
  5.     } 
  6.     InOderTraverse(T->lchild);     
  7.     cout<<T->data<<"  "; 
  8.     InOrderTraverse(T->rchild); 
  9. } 

4. 二叉树的后遍历算法

  1. void PostOrderTraverse(BinaryTree T){     
  2.     if (T->NULL){         
  3.         cout<<"#"<<"  ";         
  4.         return; 
  5.     } 
  6.     PostOrderTraverse(T->lchild); 
  7.     PostOrderTraverse(T->rchild);     
  8.     cout<<T->data<<"  "; 
  9. } 

预遍历,中阶遍历和后阶遍历算法的核心算法大致相同,均使用函数递归原理. 顺便说一下,这里添加了递归函数调用的原理:

Pei Bo Naqi序列的实现以解释该函数的递归调用,假定存在这样的函数:

使用递归实现Pebonacci序列的代码如下:

  1. int Fibonacci(int i){     
  2.     if (i<2){         
  3.         return i==0?0:1; 
  4.     }     
  5.         return Fibonacci(i-1)+Fibonacci(i-2); 
  6. } 

树与二叉树的区别_二叉树的深度怎么算_二叉树

通过二叉树的结构来分析递归调用的执行过程: (摘自分页数据结构页面P103)

主要功能中的测试代码如下:

  1. //测试代码int main() 
  2. { 
  3.     BinaryTree tree = new BinaryTreeNode;     
  4.     cout << "构建一颗由字符构成的二叉树,#代表空" << endl; 
  5.     CreateBinaryTree(&tree);     
  6.     cout << "二叉树的前序遍历输出" << endl; 
  7.     PreOderTraverse(tree);     
  8.     cout << endl;     
  9.     cout << "二叉树的中序遍历输出" << endl; 
  10.     InOderTraverse(tree);     
  11.     cout << endl;     
  12.     cout << "二叉树的后序遍历输出" << endl; 
  13.     PostOderTraverse(tree);     
  14.     cout << endl;     
  15.     return 0; 
  16. } 

输出如下所示:

假设这样的二叉树数据结构:

代表当前节点的数据字段为空

ABD#J ## EK ### CFL ### G ##

【编辑选择】

分布式存储系统中的DHT算法改善了中国存储行业,并有望实现超车. ***如何使用云存储中的数据安全技术存储和备份个人数据,涵盖整个产业链-主流云存储服务与比特币采矿采矿技术: 分布式数据存储,点对点传输,共识机制,加密算法...


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-166134-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...