1.二叉树销毁
运用递归方法
分类:
根节点+左子树+右子树(一般都是这个思路,不断进行递归即可)
选择方法(分析):
前序:如果直接销毁根就无法找到左子树右子树
中序:也会导致丢失其他数据
因此需要选择后序(遇到根不销毁,先销毁左子树,左边销毁完再销毁右子树,最后销毁根)
//二叉树销毁
void TreeDestory(BTNode* root);
{
//首先判断是否为空
if (root == NULL)
return;
TreeDestory(root->left);
TreeDestory(root->right);
//释放节点
free(root);
}
2.层序遍历(一种BFS)
DFS:例如前中后序。
BFS:例如层序遍历
以根为起点然后一层一层向下走。
逻辑:上一层带下一层。
层序都是用队列来进行辅助完成的。(属于队列的运用)
队列实现图:
出队头,空不进。
代码实现
1.依靠队列来完成因此首先需要将队列的头文件源文件实现添加进来
将其复制过来
粘贴进去就可。
注意:1.队列里边应该存节点还是存值?
首先不能存值如果只有值的话肯定通过一个数据无法找到其他数据
存节点又占用太大,因此可以存节点的指针
2.typedef后面不用BTNode*
如果用BTNode*,编译器不认识,因此需要用原类型,先这样理解就好
//2.层序遍历
#include"Queue.h"
void TreeLevelOrder(BTNode* root)
{
Queue q;//定义一个队列
QueueInit(&q);
if (root)
QueuePush(&q, root);
while (!QueueEmpty(&q))//判空如果不是空的话就继续,
{
//先取对头数据
BTNode* front = QueueFront(&q)
QueuePop(&q);
printf("%d", front->data);//打印出的是数字
if (front->left)
QueuePush(&q, front->left);
if (front->right)
QueuePush(&q, front->right);
}
QueueDestroy(&q);
}
注意:
之所以QueuePop(&q);后还可以 printf("%d", front->data);是因为Pop掉的是队列的头节点,但是树的依然存在不影响
已经传给front了,所以依然可以找到。