最近看了二叉树一章的数据结构内容,知道树这一章的遍历,根据字符序列建立二叉树,建立线索树,树与二叉树的转换,这些都涉及到了递归算法,都是先将问问题规模缩小,利用森林与二叉树之间的递归定义来巧妙的解决问题,看起来很复杂的问题,用递归很容易就解决了。
我们知道用递归算法的时候是函数的不断自我调用,知道到达截至条件,从中我们知道每次调用函数都要为函数分配空间(用于保存调用函数的的变量,传递被调用函数的参数变量),这些函数调用是后进先出的,由此被称作函数栈,它的性质与栈的后进先出是一致的。通过观察栈的调用情况,我们可以从中得到递归算法的非递归实现,其中函数栈通过自己建立一个栈的数据结构来实现。用这个栈配合代码,就能实现讲递归算法转换为非递归算法。
void postOrderTraversalIterative(BinaryTree *root) {
if (!root) return;
stack<BinaryTree*> s;
s.push(root);
BinaryTree *prev = NULL;
while (!s.empty()) {
BinaryTree *curr = s.top();
if (!prev || prev->left == curr || prev->right == curr) {
if (curr->left) {
s.push(curr->left);
} else if (curr->right) {
s.push(curr->right);
} else {
cout << curr->data << " ";
s.pop();
}
}
else if (curr->left == prev) {
if (curr->right) {
s.push(curr->right);
} else {
cout << curr->data << " ";
s.pop();
}
}
else if (curr->right == prev) {
cout << curr->data << " ";
s.pop();
}
prev = curr; // record previously traversed node
}
}
上一周的作业