该算法是基于二叉树的递归遍历算法扩展实现。(具体实现代码在本文最下方,这里带读者一步步理解算法实现思路)
首先二叉树递归遍历在底层会用到一个栈,记录当前状态。我们的灵感便是来自于此。如果我们在递归函数,传入一个栈,(不要传引用!)每次递归,若当前结点非空那么就将该节点入栈,那么每一层递归都会对应一个栈,这个栈表示当前结点到根结点的路径。如下代码:
void printLeaf(BinaryTreeNode* root,stack<char>path) {
if (root == NULL)return;
path.push(root->data);//非空就入栈
printLeaf(root->left, path);
printLeaf(root->right, path);
}
可以发现每一次递归都将当前栈传给下一层递归(传的是拷贝),所以每一层递归都记录这当前结点的路径,而这正是我们需要的!所以在递归中加入判断,如果当前接结点时叶子结点,就输出整一个栈!而输出整一个栈需要一个函数封装,具体代码如下:
//输出栈中元素
void printStack(stack<char>path) {
while (!path.empty()) {
char c = path.top();
cout << c << "-";
path.pop();
}
cout << endl;
}
//递归主体
void printLeaf(BinaryTreeNode* root, stack<char>path) {
if (root == NULL)return;
path.push(root->data);//非空就入栈
if (root->left == NULL && root->right == NULL)printStack(path);//若为叶子结点就输出栈
printLeaf(root->left, path);
printLeaf(root->right, path);
}