一.问题描述:求一棵二叉树的深度
//二叉树结点的定义
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.非递归:需要用到的数据结构通常是——栈、队列
比如:非递归版本遍历二叉树就用到了栈这一数据结构;
层序遍历就用到了队列。