二叉树遍历及应用

简介: 二叉树遍历及应用

前言


二叉树的遍历及应用主要是运用了递归、分治的思想。在这一篇文章,小编将介绍二叉树的前序遍历、中序遍历、后序遍历,求二叉树结点个数、叶节点个数、第K层结点个数、二叉树的深度。


构建二叉树


手搓二叉树的结构

小编简单构建一个二叉树的结构,方便后面的测试

构建的方式比较简单,在树的结构中有当前结点的数据、当前结点的左节点、右节点。除此之外,还需要开辟结点。


有了 前面数据结构的学习,小编认为手搓一个二叉树的结构相对来说简单一些

typedef int Tdatatype;
typedef struct Tree
{
  Tdatatype data;
  struct Tree* left;
  struct Tree* right;
}Tree;
Tree* BuyTree(Tdatatype x)
{
  Tree* node = (Tree*)malloc(sizeof(Tree));
  if (node == NULL)
  {
    perror("malloc fail");
    return NULL;
  }
  node->data = x;
  node->left = NULL;
  node->right = NULL;
  return node;
}
Tree* CreatTree()
{
  Tree* node1 = BuyTree(1);
  Tree* node2 = BuyTree(2);
  Tree* node3 = BuyTree(3);
  Tree* node4 = BuyTree(4);
  Tree* node5 = BuyTree(5);
  Tree* node6 = BuyTree(6);
  Tree* node7 = BuyTree(7);
  node1->left = node2;
  node1->right = node4;
  node2->left = node3;
  node2->right = node7;
  node4->left = node5;
  node4->right = node6;
  return node1;
}


前序遍历


若二叉树为空,则操作为空

否则:

(1)访问根节点

(2)先序遍历左子树

(3)先序遍历右子树

void PrevOrder(Tree* root)
{
  if (root == NULL)
  {
    printf("N ");
    return;
  }
  PrevOrder(root->left);
  printf("%d ", root->data);
  PrevOrder(root->right);
}


中序遍历


若二叉树为空,则操作为空

否则:

(1)中序遍历左子树

(2)访问根节点

(3)中序遍历右子树

void InOrder(Tree* root)
{
  if (root == NULL)
  {
    printf("N ");
    return;
  }
  InOrder(root->left);
  printf("%d ", root->data);
  InOrder(root->right);
}


后序遍历


若二叉树为空,则操作为空

否则:

(1)后序遍历左子树

(2)后序遍历右子树

(3)访问根节点

void PostOrder(Tree* root)
{
  if (root == NULL)
  {
    printf("N ");
    return;
  }
  PostOrder(root->left);
  PostOrder(root->right);
  printf("%d ", root->data);
}


二叉树的结点个数


求二叉树的结点个数还是用到递归的思想,即子问题分治,还需要有结束条件

子问题分治:左子树结点个数+右子树结点个数+1

返回条件:根节点为空

int TreeSize(Tree* root)
{
  return root == NULL ? 0 : TreeSize(root->right) + TreeSize(root->right) + 1;
}


二叉树的叶节点个数


求二叉树叶节点个数依然是递归思想

子问题分治:左子树叶子节点个数+右子树叶子节点个数

返回条件:根节点为空,,返回0;是叶子节点,返回1

int TreeLeaSize(Tree* root)
{
  if (root == NULL)
    return 0;
  if (root->left == NULL && root->right == NULL)
    return 1;
  return TreeLeaSize(root->left) + TreeLeaSize(root->right);
}


二叉树的高度


子问题分治:找左子树和右子树中高度较大的那一个,并+1

返回条件:根节点为空,返回0

int TreeHight(Tree* root)
{
  if (root == NULL)
    return 0;
  int left = TreeHight(root->left);
  int right = TreeHight(root->right);
  return left > right ? left + 1 : right + 1;
}


二叉树第K层结点个数


二叉树第k层的节点数=左子树的第k-1层的节点数+右子树第k-1层的节点数。

因为二叉树没有第0层,是从第一层开始的,所以k==1时,返回1。

int TreeLevelK(Tree* root, int k)
{
  assert(k > 0);
  if (root == NULL)
    return 0;
  if (k == 1)
    return 1;
  return TreeLevelK(root->left, k - 1)
    + TreeLevelK(root->right, k - 1);
}
目录
相关文章
|
分布式计算 安全 Hadoop
HBase启动时有进程webUI不显示HRegionServer各种情况解决方案
HBase启动时有进程webUI不显示HRegionServer各种情况解决方案
605 0
|
Dubbo Ubuntu Java
没有JDK和Maven,用Docker也能构建Maven工程
紧急的时候,借助Docker,在不安装JDK和Maven的环境也能构建Maven工程
2139 0
没有JDK和Maven,用Docker也能构建Maven工程
|
机器学习/深度学习 数据采集 人工智能
人工智能与机器学习的前景和挑战
人工智能和机器学习的前景是令人振奋的,它们在许多领域带来了创新和变革。然而,随着前景的广阔,也伴随着一些挑战,如数据质量、隐私和伦理问题。通过持续的研究和努力,我们有望克服这些挑战,实现人工智能和机器学习的更大潜力。从自动驾驶汽车到医疗诊断,从自然语言处理到工业自动化,人工智能和机器学习将继续塑造我们的世界。
1021 1
人工智能与机器学习的前景和挑战
|
10月前
|
存储 人工智能 编解码
多模态实时交互大模型浦语·灵笔 2.5 OmniLive开源:能看、能听、会记、会说!
2024年12月12日,多模态实时交互大模型书生·浦语灵笔2.5-OL(InternLM-XComposer2.5-OmniLive)开源,该模型可以通过视觉和听觉实时观察和理解外部世界,自动形成对观察到内容的长期记忆,并可通过语音与人类用户进行对话交谈,提供更自然的大模型交互体验。
535 4
多模态实时交互大模型浦语·灵笔 2.5 OmniLive开源:能看、能听、会记、会说!
|
10月前
|
数据采集 DataWorks 搜索推荐
阿里云DataWorks深度评测:实战视角下的全方位解析
在数字化转型的大潮中,高效的数据处理与分析成为企业竞争的关键。本文深入评测阿里云DataWorks,从用户画像分析最佳实践、产品体验、与竞品对比及Data Studio公测体验等多角度,全面解析其功能优势与优化空间,为企业提供宝贵参考。
428 13
|
12月前
|
人工智能 算法 安全
人工智能伦理与监管:构建负责任的AI未来
【10月更文挑战第3天】随着人工智能(AI)技术的快速发展,其在社会各领域的应用日益广泛。然而,AI的广泛应用也带来了一系列伦理和监管挑战。本文旨在探讨AI的伦理问题,分析现有的监管框架,并提出构建负责任AI未来的建议。同时,本文将提供代码示例,展示如何在实践中应用这些原则。
1724 1
|
存储 安全 算法
服务器数据恢复—Raid磁盘阵列的安全性分析及常见故障
出于尽可能避免数据灾难的设计初衷,RAID解决了3个问题:容量问题、IO性能问题、存储安全(冗余)问题。从数据恢复的角度讨论RAID的存储安全问题。 常见的起到存储安全作用的RAID方案有RAID1、RAID5及其变形。基本设计思路是相似的:当部分数据异常时,可通过特定算法将数据还原出来。以RAID5为例:如果要记录两个数字,可以通过再多记录这两个数字的和来达到记录冗余性的目的。例如记录3和5,同时再记录这2个数字的和8。在不记得到底是几和5的情况下,只需要用8-5就可以算出这个丢失的数字了,其余情况依此类推。
|
前端开发 Python
我们从`reportlab.pdfgen`模块中导入了`canvas`。这个模块提供了创建PDF文件所需的基本功能。
我们从`reportlab.pdfgen`模块中导入了`canvas`。这个模块提供了创建PDF文件所需的基本功能。
|
Java
Java的double值保留2位小数
【6月更文挑战第16天】Java的double值保留2位小数
521 0
|
关系型数据库 数据库 PostgreSQL
【docker-compose】一键安装PostgreSQL数据库
【docker-compose】一键安装PostgreSQL数据库
5209 0
【docker-compose】一键安装PostgreSQL数据库