【树】二叉树的前序遍历——非递归写法

今天碰到了这道题,写一下怎么实现树的前序遍历而不使用递归。

基本思路:

  1.  在我之前的博客中曾经写过,虽然递归和非递归有着紧密的联系(比如思想上),但是两者在编写上依然有很大差别。——主要体现在递归可以使用所谓整体法,而如果使用非递归的话用整体法很难想
  2. 如果使用非递归的话怎么搞呢?我们只能先通过模拟,摸清大概是怎么做的,然后再来谈具体的实现。
  3. 谈到递归,不得不谈到栈这个数据结构——我们递归要从递归函数中返回,等价于出栈这个操作——同样的,在非递归的写法中我们完全可以引入栈,当搜索完毕时出栈,直到栈顶元素是我们待处理的下一个元素
  4. 有以上的理论基础,我们的思路就比较清晰了:
  • 不断地往左子树搜索,并输出左子树的节点的值。
  • 如果搜到底了,不断回溯,看看有没有有右子树的节点,如果有,进入右子树搜索。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
// 树的左子树和右子树都是链表的形式
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
      vector<int> res;
      TreeNode *p = root;
      if (!p) return res;
      stack<TreeNode *> s;
      // 控制整个搜索的过程(什么时候结束)
      while (!s.empty() || p) {
        // 不断往左子树搜索
        while (p) {
          s.push(p);
          res.push_back(p->val);
          p = p->left;
        }
        // 进入右子树
        if (!s.empty()) {
          p = s.top();
          s.pop();
          p = p->right;
        }
     }
      return res;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值