二叉树遍历的非递归算法

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

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

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

上一周的作业

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值