二叉树的模拟创建
如果我们想知道一颗二叉树的深度是多少,那么我们首先得先创建一个二叉树对吧?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <time.h>
typedef int BTDataType;//二叉树存放数据的类型
typedef struct BinaryTreeNode {//二叉树结构的定义
struct BinaryTreeNode* left;//二叉树的左节点
struct BinaryTreeNode* right;//二叉树的右节点
BTDataType data;//二叉树的数据域
}BTNode;//将定义的二叉树结构名字重新简化定义
BTNode* BuyNode(BTDataType x) {//创建并且同时初始化二叉树的一个节点
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
if (node == NULL) {
printf("malloc fail!");
exit(-1);
}
node->left = NULL;
node->right = NULL;
node->data = x;
return node;
}
BTNode* CreatBinaryTree() {//模拟创建一个二叉树
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
BTNode* node6 = BuyNode(6);
node1->left = node2;
node1->right = node4;
node2->left = node3;
node4->left = node5;
node4->right = node6;
return node1;
}
int main(){
BTNode* root = CreatBinaryTree();//模拟创建一个二叉树
return 0;
}
将以上代码运行,没问题的话,那么它应该就可以模拟实现一颗二叉树了。
如下图:
二叉树的深度
好了,到这里我们已经创建好了一颗二叉树,接下来我们就来求一求它的深度。
(二叉树的深度就是从根节点到最大一层节点的层数)
总体思路:
如果我们要求一颗二叉树的深度的话,那么我们根据二叉树深度的定义可知,深度就是指的是从二叉树的根节点到最大一层节点的层数。
那么我们就可以用递归和分治的思想来求。递归主要是为了求层数,分治通俗的来讲就是将大化小,将二叉树分为左右子树加上一个根节点。
所以,其求深度的重点就是分别利用递归求出左右子树的层数也就是深度,然后相比较一下左右子树的层数哪一个较大,然后较大的那一个加1就求出来了深度了。
代码如下:
int TreeDepth(BTNode* root) {
if (root == NULL) {//如果这个树是空树的话,直接返回0就结束
return 0;
}
//到这里就说明它不是一个空树
int left = TreeDepth(root->left);//求其左树的层数
int right = TreeDepth(root->right);//求其右树的层数
return left > right ? left + 1 : right + 1;//利用三木运算符来比较,如果左树比右树高,则返回左树高度加一
//否则,返回右树的高度加一。
}
int main(){
BTNode* root = CreatBinaryTree();//模拟创建一个二叉树
int depth = TreeDepth(root);
printf("这颗树的深度为:%d", depth);
return 0;
}
将其与上面创建好的树代码联合可以求出其结果了。
代码图解
为了方便理解,这里再跟着画一遍递归图。
如果对代码有所不理解,可以看看递归的图,再看看代码,相信会方便于理解一点。
深度优先遍历(DFS)和广度优先遍历(BFS)
深度优先遍历,其实拿二叉树的前序遍历来联合理解就行。比如,前序遍历不是从根节点的开始,一直遍历其左节点直至为空再返回根节点,然后再访问右节点么。简单理解就是一条道走到黑,不撞南墙不回头。
广度优先遍历,就是层序遍历。它以一个点为起点,从它的周围开始一圈一圈扩散着去遍历。就像一滴水滴到水面上荡起一层一层涟漪的那种感觉。