题目链接

LeetCode

题目描述

给你二叉树的根节点 root ,返回它节点值的 前序遍历。

示例 1:

144. 二叉树的前序遍历 - 图1

输入: root = [1,null,2,3]
输出: [1,2,3]

示例 2:

输入: root = []
输出: []

示例 3:

输入: root = [1]
输出: [1]

示例 4:

144. 二叉树的前序遍历 - 图2

输入: root = [1,2]
输出: [1,2]

示例 5:

144. 二叉树的前序遍历 - 图3

输入: root = [1,null,2]
输出: [1,2]

提示:

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

解题思路

方法一:递归

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. vector<int> preorderTraversal(TreeNode* root) {
  15. vector<int> ans;
  16. preorder(root,ans);
  17. return ans;
  18. }
  19. void preorder(TreeNode* root,vector<int>& ans){
  20. if(root==nullptr){
  21. return;
  22. }
  23. ans.push_back(root->val);
  24. preorder(root->left,ans);
  25. preorder(root->right,ans);
  26. }
  27. };
  • 时间复杂度 O(n)
  • 空间复杂度 O(n)

    方法二:迭代

    ```cpp /**
    • Definition for a binary tree node.
    • struct TreeNode {
    • int val;
    • TreeNode *left;
    • TreeNode *right;
    • TreeNode() : val(0), left(nullptr), right(nullptr) {}
    • TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    • TreeNode(int x, TreeNode left, TreeNode right) : val(x), left(left), right(right) {}
    • }; / class Solution { public: vector preorderTraversal(TreeNode root) {
      vector<int> ans;
      stack<TreeNode*> stk;
      while(!stk.empty() || root != nullptr){
          while(root!=nullptr){
              ans.push_back(root->val);
              stk.push(root);
              root = root->left;
          }
          root = stk.top();
          stk.pop();
          root = root->right;
      }
      return ans;
      
      }

};

```java
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        Deque<TreeNode> stack = new LinkedList<>();
        List<Integer> res = new LinkedList<>();
        while(root != null || !stack.isEmpty()){
            if(root != null){
                res.add(root.val);
                stack.push(root);
                root = root.left;
            }else{
                root = stack.poll().right;
            }
        }
        return res;
    }
}
  • 时间复杂度 O(n)
  • 空间复杂度 O(n)

    方法三:morris遍历

    /**
    * Definition for a binary tree node.
    * struct TreeNode {
    *     int val;
    *     TreeNode *left;
    *     TreeNode *right;
    *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
    *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    * };
    */
    class Solution {
    public:
      vector<int> preorderTraversal(TreeNode* root) {
          vector<int> ans;
          TreeNode* p1 = root,*p2 = nullptr;
          while(p1!=nullptr){
              p2 = p1->left;//查看p1的左子树
              if(p2!=nullptr){// p1的左子树不为空,遍历p1和左子树
                  while(p2->right!=nullptr&&p1!=p2->right){
                      p2 = p2->right;
                  }
                  if(p2->right==nullptr){// p1的左子树未遍历完,遍历p1和左子树
                      ans.push_back(p1->val);
                      p2->right = p1;
                      p1 = p1->left;
                      continue;
                  }else{// p1的左子树全部遍历完毕
                      p2->right = nullptr;//断开和p1连接
                      p1 = p1->right;//开始遍历p1左子树
                  }
              }else{// p1的左子树为空,遍历p1和右子树
                  ans.push_back(p1->val);
                  p1 = p1->right;
              }
          }
          return ans;
      }
    };
    
    /**
    * Definition for a binary tree node.
    * public class TreeNode {
    *     int val;
    *     TreeNode left;
    *     TreeNode right;
    *     TreeNode() {}
    *     TreeNode(int val) { this.val = val; }
    *     TreeNode(int val, TreeNode left, TreeNode right) {
    *         this.val = val;
    *         this.left = left;
    *         this.right = right;
    *     }
    * }
    */
    class Solution {
      public List<Integer> preorderTraversal(TreeNode root) {
          List<Integer> res = new ArrayList<>();
          if(root == null){
              return res;
          }
          while(root != null){
              if(root.left != null){// 左子树不为空
                  TreeNode tmp = root.left;
                  while(tmp.right != null && tmp.right != root){
                      tmp = tmp.right;
                  }
                  // 将左子树最后一个节点和当前根节点相连
                  if(tmp.right == null){
                      res.add(root.val);
                      tmp.right = root;
                      root = root.left;
                  }else{// 如果已经相连,说明当前根节点和左子树已经遍历完毕,断开连接并遍历右子树
                      tmp.right = null;
                      root = root.right;
                  }
              }else{// 左子树为空
                  res.add(root.val);
                  root = root.right;
              }
          }
          return res;
      }
    }
    
  • 时间复杂度 O(n)

  • 空间复杂度 O(1)