数据结构入门-二叉树的层序遍历

如何判断一棵二叉树的深度?

层序遍历

过程演示

使用队列完成层序遍历:

1.定义变量深度depth=0,树根入队即第一层入队

2.树根出队,depth+1

3.树根的左右子树也就是第二层入队

4.B节点出队,B节点的左右子树入队

5.C节点出队,depth+1,C节点的左右子树入队

以此循环,求出二叉树总深度depth。

代码实现

cpp 复制代码
//获取二叉树深度
int maxDepth(TreeNode* root)
{
	if (root == NULL)
	{
		return 0;
	}

	int depth = 0;//深度
	Queue* q = initQueue();//初始化队列
	equeue(q, root);//树根入队

	while (!isEmpty(q))
	{
		int count = queueSize(q);
		while (count > 0)
		{
			TreeNode* curr;
			dequeue(q, &curr);
			if (curr->lchild != NULL)
			{
				equeue(q, curr->lchild);
			}
			if (curr->rchild != NULL)
			{
				equeue(q, curr->rchild);
			}
			count--;
		}
		depth++;
	}
	return depth;
}

主程序

这个程序中求二叉树深度的实现依靠队列等知识点

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
const int MAXSIZE =100;
typedef char TreeType;

//树的结构
typedef struct TreeNode
{
	TreeType data;
	struct TreeNode* lchild;
	struct TreeNode* rchild;
}TreeNode;

typedef TreeNode* ElemType;

//队列结构
typedef struct
{
	ElemType* data;
	int front;
	int rear;
}Queue;

typedef TreeNode* BiTree;

char str[] = "ABDH#K###E##CFI###G#J##";
int index = 0;

void createTree(BiTree *T)
{
	TreeType ch;
	ch = str[index++];
	if (ch == '#')
	{
		*T=NULL;
	}
	else
	{
		*T = new TreeNode;
		(*T)->data = ch;
		createTree(&(*T)->lchild);
		createTree(&(*T)->rchild);
	}
}
//初始化
Queue* initQueue()
{
	Queue* q = new Queue;
	q->data = new ElemType[MAXSIZE];
	q->front = 0;
	q->rear = 0;
	return q;

}

//判断队列是否为空
int isEmpty(Queue* Q)
{
	if (Q->front == Q->rear)
	{
		cout << "空的" << endl;
		return 1;
	}
	else
	{
		return 0;
	}
}

//入队
int equeue(Queue* Q, ElemType e)
{
	if ((Q->rear + 1) % MAXSIZE == Q->front)
	{
		cout << "满了" << endl;
		return 0;
	}
	Q->data[Q->rear] = e;
	Q->rear = (Q->rear + 1) % MAXSIZE;
	return 1;


}

//出队
int dequeue(Queue* Q, ElemType* e)
{
	if (Q->front == Q->rear)
	{
		cout << "空的" << endl;
		return 0;
	}
	*e = Q->data[Q->front];
	Q->front = (Q->front + 1) % MAXSIZE;
	return 1;
}
//获取队头元素
int getHead(Queue* Q, ElemType* e)
{
	if (Q->front == Q->rear)
	{
		cout << "空的" << endl;
	}
	*e = Q->data[Q->front];
	return 1;
}

//获取队列元素数量
int queueSize(Queue* Q)
{
	if (!isEmpty(Q))
	{
		return (Q->rear - Q->front+MAXSIZE)%MAXSIZE;
	}
	else
	{
		return 0;
	}
}

//获取二叉树深度
int maxDepth(TreeNode* root)
{
	if (root == NULL)
	{
		return 0;
	}

	int depth = 0;//深度
	Queue* q = initQueue();//初始化队列
	equeue(q, root);//树根入队

	while (!isEmpty(q))
	{
		int count = queueSize(q);
		while (count > 0)
		{
			TreeNode* curr;
			dequeue(q, &curr);
			if (curr->lchild != NULL)
			{
				equeue(q, curr->lchild);
			}
			if (curr->rchild != NULL)
			{
				equeue(q, curr->rchild);
			}
			count--;
		}
		depth++;
	}
	return depth;
}


int main()
{
	BiTree T;
	createTree(&T);
	cout << maxDepth(T) << endl;

	return 0;
}

运行程序可获得该二叉树深度为5。

相关推荐
小O的算法实验室21 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
LIST 的相关知识
数据结构·list
M--Y1 天前
Redis常用数据类型
数据结构·数据库·redis
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能1 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数