144. Binary Tree Preorder Traversal 二叉树前序遍历

题目链接
tag:

  • Medium;

question:
  Given a binary tree, return the preorder traversal of its nodes' values.

Example:

Input: [1,null,2,3]
1
\
2
/
3
Output: [1,2,3]
Follow up: Recursive solution is trivial, could you do it iteratively?

思路:
  树的遍历最常见的有先序遍历,中序遍历,后序遍历和层序遍历,它们用递归实现起来都非常的简单。而题目的要求是不能使用递归求解,于是只能考虑到用非递归的方法,这就要用到 stack 来辅助运算。由于先序遍历的顺序是"根-左-右",我们使用了一个辅助结点p,这种写法其实可以看作是一个模版,对应的还有中序和后序的模版写法,形式很统一,方便于记忆。辅助结点p初始化为根结点,while循环的条件是栈不为空或者辅助结点p不为空,在循环中首先判断如果辅助结点p存在,那么先将p加入栈中,然后将p的结点值加入结果res中,此时p指向其左子结点。否则如果p不存在的话,表明没有左子结点,我们取出栈顶结点,将p指向栈顶结点的右子结点,代码如下:

/**
 * 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 preorderTraversal(TreeNode* root) {
        vector res;
        if (!root) return res;
        stack sk;
        TreeNode *p = root;
        while (p || !sk.empty()) {
            if (p) {
                sk.push(p);
                res.push_back(p->val);
                p = p->left;
            }
            else {
                TreeNode *t = sk.top();
                sk.pop();
                p = t->right;
            }
        }
        return res;
    }
};

类似题目:

  • 102. Binary Tree Level Order Traversal 二叉树层序遍历
  • 94. Binary Tree Inorder Traversal 二叉树中序遍历
  • 145. Binary Tree Postorder Traversal 二叉树后序遍历

你可能感兴趣的:(144. Binary Tree Preorder Traversal 二叉树前序遍历)