144. 二叉树的前序遍历(非递归实现)

题目描述

Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree{1,#,2,3},

    1
     \
      2
     /
    3

return[1,2,3].
Note: Recursive solution is trivial, could you do it iteratively?

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

代码实现

C++ 实现

class Solution {
public:
    vector<int> preorderTraversal(TreeNode *root) 
    {
      vector<int> ret;
      //利用程序中的栈,模拟系统堆栈的功能
      stack<TreeNode*> s;
      //路径上的当前的节点
      TreeNode *p=root;
      while(p!=NULL||!s.empty())
      {   
          //按照先序遍历的顺序,栈中存储的是先序遍历经过的路径上遇到
          //的节点,根据先序遍历的特点,这个循环中已经将根节点,左子节点访问过了
          while(p!=NULL)
          {
            ret.push_back(p->val);
            s.push(p);
            p=p->left;
         }
         //之所以要用栈保存访问过的路径上经过的节点,是因为我们只能由父节点得到左、右  
        //子节点,所以经过的路径上的节点还有用,不能丢弃,我们暂时保存在栈中,而根据先
       //序遍历的特点,我们需要从经过的路径的下面到上面进行回溯。这就需要栈的回退的特点
         if(!s.empty())
         {
             p=s.top();
             s.pop();
             p=p->right;
         }
     }

     return ret;
  
    }
}

node.h:

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

pre_order.cpp:

#include "node.h"
#include <vector>
#include <stack>

using namespace std;

vector<int> preorderTraversal(TreeNode *root)
{
    if (root == nullptr)
        return {};
    vector<int> ret;
    stack<TreeNode *> stk;
    TreeNode *p = root;
    while (true)
    {
        while (p != nullptr)
        {
            ret.push_back(p->val);
            stk.push(p);
            p = p->left;
        }
        if (!stk.empty())
        {
            TreeNode *temp = stk.top();
            stk.pop();
            p = temp->right;
        }
        else
            break;
    }
    return ret;
}

java实现

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<Integer>();
        Deque<TreeNode> stk = new LinkedList<TreeNode>();
        TreeNode p = root;
        while (true) {
            while (p != null) {
                ret.add(p.val);
                stk.push(p);
                p = p.left;
            }
            if (!stk.isEmpty()) {
                p = stk.peek();
                stk.pop();
                p = p.right;
            } else
                break;
        }
        return ret;
    }
}

posted on 2021-05-16 11:37  朴素贝叶斯  阅读(40)  评论(0编辑  收藏  举报

导航