C++/数据结构——递归/非递归求二叉树的深度

一.问题描述:求一棵二叉树的深度

//二叉树结点的定义
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
		val(x), left(NULL), right(NULL) {
	}
};

二.问题解决:

1.递归:

1)明确递归边界--树空(深度就是0)

2)返回左右子树中较大的结果然后加1(根节点)

	int TreeDepth(TreeNode* pRoot)
	{
		if (!pRoot) {
			return 0;
		}
		int left = TreeDepth(pRoot->left);
		int right = TreeDepth(pRoot->right);
		return (left > right ? left : right) + 1;
	}

递归版本较为简单,接下来看非递归版本

2.非递归——层序遍历的思想(层数即深度

1)需要用到的数据结构——队列

2)在层序遍历时加上限制条件,即一层一层遍历

3)每一层节点的数目就是队列内节点的数目

	//非递归:利用层序遍历
	int depth(TreeNode* pRoot) {
		if (!pRoot) {
			return 0;
		}
		queue<TreeNode*> q;
		q.push(pRoot);
		int level = 0;
		while (!q.empty()) {
			int len = q.size();		//现在队列内的元素数目就是当前层数的节点数目
			level++;
            //执行遍历一层,并且将下一层入队
			while (len--) {
				TreeNode* top = q.front();
				q.pop();
				if (top->left) {
					q.push(top->left);
				}
				if (top->right) {
					q.push(top->right);
				}
			}
		}
		return level;
	}

 三.总结

1.对于递归:二叉树问题绝大多数问题最先想到的就是递归--因为二叉树的定义就是递归定义,需要注意的是递归的边界经常是树空;

2.非递归:需要用到的数据结构通常是——栈、队列

     比如:非递归版本遍历二叉树就用到了栈这一数据结构;

                 层序遍历就用到了队列。

发布了58 篇原创文章 · 获赞 43 · 访问量 4377

猜你喜欢

转载自blog.csdn.net/Wz_still_shuai/article/details/104073290