二叉树的初始化·数据结构

简介: 二叉树是什么?二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分

二叉树是什么?

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分


思路:


首先,需要创建一个BTNode的结点,结点包含了数据,两个指针——lchild和rchild,再一个BTNode的构造函数,来初始化结点

接着,创建二叉树的类,类包含了头结点,以及各函数的实现操作。(初始化函数、创建树函数、遍历函数、求树的结点个数、求树的叶子数、求树的深度)


代码如下:

using namespace std;
typedef int Element;
//定义结点
struct BTNode {
  Element data;
  BTNode* lchild;
  BTNode* rchild;
  //结构体的构造函数
  BTNode(Element number) {
    data = number;
    lchild = NULL;
    rchild = NULL;
  }
};
//定义二叉树类
class Btree {
public:
  BTNode* Root;
  //初始化创建树头
  void Init() {
    Root = CreatBTree();
    cout << "树创建成功" << endl;
  }
  //创建树(前序)
  BTNode* CreatBTree() {
    BTNode* p;
    Element number;
    cin >> number;
    if (number == 0)
      p = NULL;
    else {
      p = new BTNode(number);
      p->lchild = CreatBTree();
      p->rchild = CreatBTree();
    }
    return p;
  }
  //前序遍历
  void preOrderTraverse(BTNode *root) {
    if (root) {
      cout << root->data << " ";
      preOrderTraverse(root->lchild);
      preOrderTraverse(root->rchild);
    }
  }
  //中序遍历
  void inOrderTraverse(BTNode* root) {
    if (root) {
      inOrderTraverse(root->lchild);
      cout << root->data << " ";
      inOrderTraverse(root->rchild);
    }
  }
  //后序遍历
  void lastOrderTraverse(BTNode* root) {
    if (root) {
      lastOrderTraverse(root->lchild);
      lastOrderTraverse(root->rchild);
      cout << root->data << " ";
    }
  }
  //求叶子结点个数
  int LeafNum(BTNode* root) {
    if (root == NULL) {
      return 0;
    }
    else if (root->lchild == NULL && root->rchild == NULL)
      return 1;
    else
      return LeafNum(root->lchild) + LeafNum(root->rchild);
  }
  //求树的结点个数
  int BTNodeNum(BTNode* root) {
    if (root == NULL)
      return 0;
    else
      return BTNodeNum(root->lchild) + BTNodeNum(root->rchild) + 1;
  }
  //求树的深度
  int TreeDepth(BTNode* root) {
    if (root == NULL)
      return 0;
    int left = TreeDepth(root->lchild);
    int right = TreeDepth(root->rchild);
    return left > right ? left + 1 : right + 1;
  }
};
int main()
{
  Btree T;
  //初始化
  T.Init();
  //遍历
  cout << "前序遍历为:" << endl;
  T.preOrderTraverse(T.Root);
  cout << endl;
  cout << "中序遍历为:" << endl;
  T.inOrderTraverse(T.Root);
  cout << endl;
  cout << "后序遍历为:" << endl;
  T.lastOrderTraverse(T.Root);
  cout << endl;
  //树的结点个数
  cout << "树的结点个数为:";
  int nodenum = T.BTNodeNum(T.Root);
  cout << nodenum << endl;
  //树的叶子个数
  cout << "树的叶子个数为:";
  int leaves = T.LeafNum(T.Root);
  cout << leaves << endl;
  //树的深度为:
  cout << "树的深度为:";
  int depth = T.TreeDepth(T.Root);
  cout << depth << endl;
  system("pause");
  cout << endl;
}


相关文章
|
26天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
83 8
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
24 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
27 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
2月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
28 1
|
2月前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
25 1
|
2月前
|
存储
【数据结构】二叉树链式结构——感受递归的暴力美学
【数据结构】二叉树链式结构——感受递归的暴力美学
|
2月前
|
存储 算法
探索数据结构:分支的世界之二叉树与堆
探索数据结构:分支的世界之二叉树与堆
|
2月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
28 0
|
2月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现
|
2月前
|
存储
【数据结构】二叉树零基础无压力上手,超详解
【数据结构】二叉树零基础无压力上手,超详解
29 0