剑指offer——树:二叉树的深度
1、单独函数递归,使用两个变量
注意把外面的变量传入要使用引用传递,否则外面变量值不变
递归函数内部,设一个变量存储当前的实时深度,存一个变量存储最终返回值
每递归一次,深度+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==nullptr){return 0;}int ans=0;func(pRoot,1,ans);return ans;}void func(TreeNode* pRoot,int deepth,int& ans){if(pRoot==nullptr)return ;if(deepth>ans){ans=deepth;}func(pRoot->left, deepth+1, ans);func(pRoot->right,deepth+1,ans);}
};
2、直接在原函数内递归处理
设左变量判断左子树的深度,设右变量判断右子树的深度,最终结果判断左子树和右子树的大小,返回大的值+1(根的深度为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==nullptr){return 0;}int leftDeepth=TreeDepth(pRoot->left);int rightDeepth=TreeDepth(pRoot->right);return max(leftDeepth,rightDeepth)+1;}
};
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==nullptr){return 0;}//设一个队列,存储树内的节点queue<TreeNode*> q;//把根放入队列q.push(pRoot);//设ans变量记录当前深度int res=0;//当队列不为空时while(!q.empty()){//记录队列当前层的节点数int n=q.size();//遍历当前层的每个节点for(int i=0;i<n;i++){//设变量表示队列最前面的元素TreeNode* node=q.front();//弹出当前元素q.pop();//添加下一层的左右节点if(node->left!=nullptr)q.push(node->left);if(node->right!=nullptr)q.push(node->right);}//遍历结束,要进行下一层了,层次+1res++;}return res;}
};