二叉树遍历的非递归算法

来源:互联网 发布:无网络访问 编辑:程序博客网 时间:2024/05/16 08:37

最近看了二叉树一章的数据结构内容,知道树这一章的遍历,根据字符序列建立二叉树,建立线索树,树与二叉树的转换,这些都涉及到了递归算法,都是先将问问题规模缩小,利用森林与二叉树之间的递归定义来巧妙的解决问题,看起来很复杂的问题,用递归很容易就解决了。

我们知道用递归算法的时候是函数的不断自我调用,知道到达截至条件,从中我们知道每次调用函数都要为函数分配空间(用于保存调用函数的的变量,传递被调用函数的参数变量),这些函数调用是后进先出的,由此被称作函数栈,它的性质与栈的后进先出是一致的。通过观察栈的调用情况,我们可以从中得到递归算法的非递归实现,其中函数栈通过自己建立一个栈的数据结构来实现。用这个栈配合代码,就能实现讲递归算法转换为非递归算法。

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  }}

上一周的作业

0 0
原创粉丝点击