找树节点在二叉树中的深度

/*
*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:
");
		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);
//巧妙的利用path的size增加来判断是否找到节点
if (preSize < path.size()) return;
path.pop_back();
}

  这题最容易错的是子树找到节点这种情况没有单独讨论,导致path.pop_back()执行,释放当前压入容器节点,产生逻辑错误。

      最后只要把path.size()-1打印出来就是节点的深度了

     从中可以看出递归写法可以简单优雅地把回溯思路表现出来,掌握递归的写法是程序员能力的一种体现。