【数据结构】二叉树(二)

简介: 【数据结构】二叉树(二)

7. 二叉树查找值为x的节点


微信图片_20230221190131.png

按照前序遍历的思想去实现,因为左边如果找到了,没必要再去右面找,此外,对于查找,与上述代码的思想类似,即看成两层,将其改成递归:


BTNode* TreeFind(BTNode* root, BTDataType x)
{
  if (root == NULL)
    return NULL;
  if (root->data == x)
    return root;
  if (TreeFind(root->left, x))
    return TreeFind(root->left, x);
    if (TreeFind(root->right, x))
    return TreeFind(root->right, x);
  return NULL;
}

当然也可以设置一个临时变量:


BTNode* TreeFind(BTNode* root, BTDataType x)
{
  if (root == NULL)
    return NULL;
  if (root->data == x)
    return root;
  BTNode* lret = TreeFind(root->left, x);
  if (lret)
    return lret;
  BTNode* rret = TreeFind(root->right, x);
  if (rret)
    return rret;
  return NULL;
}

微信图片_20230221190229.png


8. 求二叉树的最大深度


为了突出最大深度,这里让其创建节点的时候2多加一个节点,即如下图:

微信图片_20230221190316.png

仍然按照文章中突出的思想,看成两层,比较其长度,返回大的那个


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

为了不让后面的长度过长影响美观,可以这样:

//求最大深度
int TreeHeight(BTNode* root)
{
  if (root == NULL)
    return 0;
  int lefthight = TreeHeight(root->left);
  int righthight = TreeHeight(root->right);
  return lefthight > righthight ? lefthight + 1 : righthight + 1;
}

微信图片_20230224185329.png

9. 判断二叉树是否是完全二叉树



微信图片_20230221190509.png


对于此图,不是一个二叉树,那么如何判断呢这个不为二叉树呢?


当我们把此二叉树的节点一一罗列(指针不为空的以其指向的data代替)


按照前序遍历:(将最后一层的左右孩子也包括在内)


1->2->4->3->NULL->5->6->NULL->NULL->NULL->NULL->NULL->NULL


那完全二叉树又是怎样罗列的呢?下面给个完全二叉树的图同样按照前序遍历来看看:

微信图片_20230224185434.png

1->2->4->3->6->NULL->NULL->NULL->NULL->NULL->NULL


这时候我们会发现,完全二叉树的罗列过程中,只要出现了第一个空,后面就全为空,对于非完全二叉树,出现了第一个空之后,后面也会出现非空的节点,因此,二者的区别我们就看出来了,对于这种问题,仍然需要以队列的方向去考虑,即如层序遍历一样,先Push一个,当Pop掉时,让其将两个孩子拽到队列里面来,唯一区别就是节点为空也要拽入,上面的层序遍历已经提到,队列的data储存的是节点指针,即便为空,也能储存。


代码:


//判断二叉树是否是完全二叉树
int BinaryTreeComplete(BTNode* root)
{
  Queue q;
  QueueInit(&q);
  if (root)
    QueuePush(&q, root);
  while (!QueueEmpty(&q))
  {
    BTNode* front = QueueFront(&q);
    QueuePop(&q);
    if (front == NULL)
    {
      break;
    }
    QueuePush(&q, front->left);
    QueuePush(&q, front->right);
  }
  while (!QueueEmpty(&q))
  {
    BTNode* front = QueueFront(&q);
    QueuePop(&q);
    if (front != NULL)
    {
      QueueDestory(&q);
      return false;
    }
  }
  QueueDestory(&q);
  return true;
}

微信图片_20230224185544.png



10. 销毁二叉树


销毁二叉树经过上面的各种描述应该很容易理解了

//销毁树 思路:找到左右子树之后再销毁本身,否则找不到子树
void BinaryTreeDestroy(BTNode* root)
{
  if (root == NULL)
  {
    return;
  }
  BinaryTreeDestroy(root->left);
  BinaryTreeDestroy(root->right);
  free(root);
}


11. 由二叉树的遍历序列构造二叉树

这里是后续加上的pdf笔记


12. 总结

本文章所讲的二叉树仅仅是入门的二叉树,但相比之前学的,这里的递归二叉树仍是大家面对的一个前所未有的难点,但是只要记住这里的化繁为简,由简到繁的思想,碰到层数多的二叉树,就想象成两层去做,这样才能把握住其中的奥妙,而二叉树的oj题,我打算单独写成一篇,目的就是让大家先掌握这些基本的函数再去训练,否则效果不会很明显,让我们一起攻克难关,拿捏二叉树!



相关文章
|
20天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
71 8
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
24 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
25 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
1月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
28 1
|
1月前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
25 1
|
1月前
|
存储
【数据结构】二叉树链式结构——感受递归的暴力美学
【数据结构】二叉树链式结构——感受递归的暴力美学
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
1月前
|
存储 算法 调度
数据结构--二叉树的顺序实现(堆实现)
数据结构--二叉树的顺序实现(堆实现)
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(二)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解