标签:blog ar div amp size log res type
/*
*pRoot接收要检索的树的根节点,pNode是要确认深度的结点
path存储从根结点到pNode的所有节点,包括了pNode和根节点
*/
void findPath(BinaryTreeNode *pRoot, BinaryTreeNode *pNode, vector<int> &path){
if (pRoot == NULL) return;
path.push_back(pRoot->m_nValue);
if (pRoot == pNode){
//找到了节点,立即返回
printf("A path is found:\n");
return;
}
vector<int>::size_type preSize = path.size();
//若在左子树找到pNode,不要释放当前节点,立即返回
findPath(pRoot->m_pLeft, pNode, path);
//巧妙的利用path的size增加来判断是否找到节点
if (preSize < path.size()) return;
//若在左子树找到pNode,不要释放当前节点,立即返回
findPath(pRoot->m_pRight, pNode, path);
//若在左子树找到pNode,不要释放当前节点,立即返回
if (preSize < path.size()) return;
path.pop_back();
}
这题最容易错的是子树找到节点这种情况没有单独讨论,导致path.pop_back()执行,释放当前压入容器节点,产生逻辑错误。
最后只要把path.size()-1打印出来就是节点的深度了
从中可以看出递归写法可以简单优雅地把回溯思路表现出来,掌握递归的写法是程序员能力的一种体现。
标签:blog ar div amp size log res type
原文地址:http://www.cnblogs.com/hzmbbbb/p/3889169.html