/* *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打印出来就是节点的深度了
从中可以看出递归写法可以简单优雅地把回溯思路表现出来,掌握递归的写法是程序员能力的一种体现。
时间: 2024-12-24 04:03:03