问题:给定一个二叉树求出其深度
方法:递归和非递归方法
递归:对于根节点来说,只有两个子树,求得左右子树深度,去大的即可。对于根节点下的子节点,每个子节点也只有两个子树,所以可以使用分治法实现。
int maxDepth(TreeNode* root){
if(root==NULL) return 0;//递归结束的条件
int left=1;//因为当前结点不为空,所以其左右子树深度起始均为1
int right=1;
left+=maxDepth(root->left);//递归求解左子树深度
right+=maxDepth(root->right);//递归求解右子树深度
return left>right?left:right;//归并得到最后的解
}
非递归:使用两个栈,一个是点栈一个是深度栈,这样可使用非递归的方法求出深度、
<pre class="cpp" name="code">int maxDepth(TreeNode* root){
if(root==NULL) return 0;
int maxDepth=0;
stack<TreeNode*> nodeStack;//存储节点
stack<int> depthStack;//存储深度
nodeStack.push(root);//根节点入栈
depthStack.push(1);//因为有根节点,所以深度从1开始
while(!nodeStack.empty()){//节点栈非空
TreeNode* p=nodeStack.top();//取两个栈的第一个元素
int depth=depthStack.top();
nodeStack.pop();
depthStack.pop();
if(depth>maxDepth) maxDepth=depth;
if(p->left!=NULL){
nodeStack.push(p->left);//p的左节点入栈
depthStack.push(p->depth+1);//深度加1
}
if(p->right!=NULL){
nodeStack.push(p->right);//p的右节点入栈
depthStack.push(depth+1);//深度加1
}
}
return maxDepth;
}