【二叉树】构建销毁二叉树

目录

创建二叉树

整体思路

代码实现

图示理解​

销毁二叉树

判断二叉树是否是完全二叉树&层序 

整体思路

代码实现

图是理解 

二叉树的性质  

题目


创建二叉树

整体思路

  • 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
  • 遇到#就回退,返回NULL,链接到上层递推的左边/右边
  • 开辟节点,按照前序(根左右)的顺序。放入元素到开辟的空间。
  • 递退下去的是左节点就链接到左边
  • 递退下去的是右节点就链接到右边
  • return root 返回节点链接到上层的左边/右边

代码实现

//创建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{if (a[*pi] == '#'){(*pi)++;return NULL;}BTNode* root = (BTNode*)malloc(sizeof(BTNode*));root->data = a[(*pi)++];root->left = BinaryTreeCreat(a, pi);root->right = BinaryTreeCreate(a, pi);return root;
}

图示理解

销毁二叉树

  • 销毁二叉树前序/中序/后序都可以
  • 后序最方便,不需要先保存左右孩子
  • 形式参数是实际参数的一份临时拷贝。(置空有两种方法)
  • 方法1:指针的指针
  • 方法2:在main函数里面销毁 
  • ❗一定要销毁
  1. 函数return之前
  2. 使用了动态内存开辟的地方都要销毁
//销毁二叉树
void BinaryTreeDestory(BTNode** root)
{if (*root == NULL)return;BinaryTreeDestory(*((*root)->left));//❌BinaryTreeDestory(*((*root)->right));free(*root);*root = NULL;
}
//销毁二叉树
#include<stdio.h>
void BinaryTreeDestory(BTNode* root)
{if (root == NULL)return;BinaryTreeDestory(root->left);BinaryTreeDestory(root->right);free(root);
}
int main()
{BTNode* root = CreatBinaryTree();BinaryTreeDestory(root);root=NULL;return 0;
}

判断二叉树是否是完全二叉树&层序 

整体思路

  • 完全二叉树一层一层(层序遍历)走,就是连续的
  • 只要不连续就不是完全二叉树
  • 层序遍历(全部元素都入队列❗空也入队列)
  • 遇到空了就跳出循环
  • 进入另外一个循环
  • 查看从空开始后面的元素是否都是NULL
  • 若全是NULL则证明是完全二叉树
  • 若还有元素则证明不是完全二叉树
  • 注意❗return之前记得要销毁

代码实现

//判断完全二叉树
int BinaryTreeComplete(BTNode* root)
{Queue pq;QueueInit(&pq);if (root)QueuePush(&pq, root);while (!QueueEmpty(&pq)){BTNode* tmp = QueueFront(&pq);//队列头的元素QueuePop(&pq);//出元素到队头if (tmp == NULL){break;}QueuePush(&pq, tmp->left);QueuePush(&pq, tmp->right);}while (!QueueEmpty(&pq))//队列里面的元素个数){if (QueueFront(&pq)){QueueDestroy(&pq);return false;}QueuePop(&pq);//出元素到队头}QueueDestroy(&pq);return true;
}

图是理解 

二叉树的性质  

  • 对任何一棵二叉树,如果度为0其叶结点个数为n0, 度为2的分支结点个数为n2 ,则有n0=n2+1
  • 其他结论前面都已论证过了
  • 一棵树节点个数=度为0(叶子节点)+度为1+度为2

 

题目

1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为
A 不存在这样的二叉树
B 200
C 198
D 199
2.下列数据结构中,不适合采用顺序存储结构的是
A 非完全二叉树
B 堆
C 队列
D 栈
3.在具有 2n 个结点的完全二叉树中,叶子结点个数为
A n
B n+1
C n-1
D n/2
4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为
A 11
B 10
C 8
D 12
5.一个具有767个节点的完全二叉树,其叶子节点个数为
A 383
B 384
C 385
D 386
答案:BAABB

【第三题】

 大家可以自己尝试写第五题??

达克效应。最近这个多度递归,大概已经到了我的自信奔溃区了。

🙂感谢大家的阅读,若有错误和不足,本章初阶学习二叉树就结束了,下篇进入排序。欢迎指正。大家新年快乐!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/464764.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言游戏实战(4):人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏&#xff1a; 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时…

视觉SLAM十四讲学习笔记(二)三维空间刚体

哔哩哔哩课程连接&#xff1a;视觉SLAM十四讲ch3_哔哩哔哩_bilibili​ 目录 一、旋转矩阵 1 点、向量、坐标系 2 坐标系间的欧氏变换 3 变换矩阵与齐次坐标 二、实践&#xff1a;Eigen&#xff08;1&#xff09; 运行报错记录与解决 三、旋转向量和欧拉角 1 旋转向量 …

程序员如何 “高效学习”?

开篇先说说我吧&#xff0c;马上人生要步入30岁的阶段&#xff0c;有些迷茫&#xff0c;更多的是焦虑&#xff0c;因为行业的特殊性导致我无时无刻不对 “青春饭” 的理论所担忧。担忧归担忧&#xff0c;生活还要继续&#xff0c;我们都知道这行全靠 “学习” 二字&#xff0c;…

Java多态原理

参考 虚方法 JVM杂记&#xff1a;对多态实现原理、虚方法表、虚方法、静态解析、动态链接的一些思考_多态和方法表的关系-CSDN博客 静态分派与动态分派 &#xff08;JVM&#xff09;Java虚拟机&#xff1a;静态分派 & 动态分派 原理解析 - 掘金 虚方法表 JVM 栈帧&am…

vscode配置wsl ubuntu c++的环境

在ubuntu安装llvm/clang sudo apt install llvm clang clangd lldb vscode的调试器接口是按GDB开发的&#xff0c;所以需要一个适配器&#xff0c;lldb-mi就是这个适配器。lldb-mi原来是llvm项目的一部分&#xff0c;后面成为了一个单独的项目https://github.com/lldb-tools/…

Python静态方法和类方法的区别和应用

实际上&#xff0c;Python 完全支持定义类方法&#xff0c;甚至支持定义静态方法。Python 的类方法和静态方法很相似&#xff0c;它们都推荐使用类来调用&#xff08;其实也可使用对象来调用&#xff09;。 类方法和静态方法的区别在于&#xff0c;Python会自动绑定类方法的第…

【深度学习】讲透深度学习第3篇:TensorFlow张量操作(代码文档已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归&#xff08;含代码&#xff09;&#xff0c;熟练掌握numpy,pandas,sklearn等框架使用。在算法上&#xff0c;掌握神经网络的数学原理&#xff0c;手动实…

在Linux系统中设置全局HTTP代理的步骤与技巧

在Linux系统中&#xff0c;设置全局HTTP代理可以方便我们统一管理和控制网络请求。这不仅可以帮助我们加速网络访问&#xff0c;还可以在某些情况下绕过网络限制或实现匿名上网。下面&#xff0c;我将为你详细介绍在Linux系统中设置全局HTTP代理的步骤与技巧。 步骤一&#xf…

模拟发送 Ctrl+Alt+Del 快捷键

目录 前言 一、在 XP 系统上模拟 SAS 二、在不低于 Vista 的系统上模拟 SAS 2.1 一些细节 2.2 实现原理和应用 三、完整实现代码和测试 3.1 客户端控制台程序 3.2 服务程序 3.3 编译&测试程序 四、总结&更新 参考文献 前言 对于开启了安全登陆的窗口工作站…

[C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法

【创建圆形进度条流程】 在C# WinForms应用程序中创建一个圆形进度条&#xff08;通常用作仪表盘的显示&#xff09;可以通过多种方式实现。下面是一个简单的例子&#xff0c;演示如何使用System.Drawing命名空间中的图形绘制功能来绘制一个基本的圆形进度条。 首先&#xff0…

docker 部署 mongodb 集群【建议收藏】

一、简洁搭建mognodb副本集 环境说明 我都是在云服务器上搭建的&#xff0c;CentOS7&#xff0c;Docker环境&#xff0c;版本忘记了。我就直接在同一台服务器上搭建三个mongodb即可。 1、基本信息如下 服务器地址 www.it307.top 副本集名称 rs 容器节点及端口映射 ​ m0…

开关电源学习之Boost电路

如果我们需要给一个输入电压为5V的芯片供电&#xff0c;而我们只有一个3.3V的电源&#xff0c;那怎么办&#xff1f; 我们能不能把3.3V的电压升到5V&#xff1f; 一、电感的简介 而在升压的电路设计方案中&#xff0c;使用到一个重要的元器件&#xff1a;电感。 电感的特性…