剑指offer--二叉树的深度

题目描述:

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

本题采用队列和递归两种思路求解

  • 先介绍用“队列”这种数据结构来求解,利用二叉树深度的过程来统计深度
    1.如果是一颗空树,则返回深度为0
    2.把树的根节点进队列
    3.当队列中的数据元素不为空时,一直循环一下操作:队列的队头元素出队列,判断出队列的元素的左孩子是否为空,不为空则进队列,同样再判断有孩子;如果出队列的元素时某一层的最后一个节点,这深度加1。代码如下,仅供参考。
/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};
*/
class Solution {
public:
	int TreeDepth(TreeNode* pRoot)
	{
		//利用队列
		if(pRoot==NULL) return 0;
		queue<TreeNode*> nodeQueue;
		TreeNode *p;
		TreeNode *q = pRoot;//q变量是用来记录某一层的最右边(最后一个)的结点
		int deep = 0;
		nodeQueue.push(pRoot);
		while(!nodeQueue.empty()){
			p = nodeQueue.front();
			nodeQueue.pop();
			if(p->left!=NULL) nodeQueue.push(p->left);
			if(p->right!=NULL) nodeQueue.push(p->right);
			if(p==q){//判断是否是某一层最右边的结点
				deep++;
				q = nodeQueue.back();//记录下一层最右边的结点
			}
		}
		return deep;
	}
};

  • 利用递归来求二叉树的深度,递归代码简单,但可能出现内存泄漏的问题
/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
	int TreeDepth(TreeNode* pRoot)
	{ 
		//递归算法
		if(pRoot==NULL) return 0;
		return 1+max(TreeDepth(pRoot->left),TreeDepth(pRoot->right));
	}
};
posted @ 2020-05-02 19:37  小辉仔  阅读(84)  评论(0)    收藏  举报