LeetCode144 二叉树的前序遍历

Posted 咖喱橙的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode144 二叉树的前序遍历相关的知识,希望对你有一定的参考价值。

给定一个二叉树,返回它的 前序 遍历。

 示例:

输入: [1,null,2,3]  
   1
         2
    /
   3 

输出: [1,2,3]

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

 

 


 

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
/*
算法思想:
    采用递归的思想,即借助系统栈,效率较低。二叉树的前序遍历规则:1. 访问根结点; 2. 遍历左子树; 3. 遍历右子树 
*/
/*
class Solution {
private:
    void rec(TreeNode* root,vector<int> &ret){
        if(root != NULL){
            ret.push_back(root->val);
            rec(root->left,ret);
            rec(root->right,ret);
        }
    }
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ret;
        rec(root,ret);
        return ret;
    }
};*/

/*
算法思想:
    采用迭代的方法,使用了一个辅助结点p,这种写法其实可以看作是一个模版,对应的还有中序和后序的模版写法,形式很统一,方便于记忆。
    辅助结点p初始化为根结点,while循环的条件是栈不为空或者辅助结点p不为空,在循环中首先判断如果辅助结点p存在,那么先将p加入栈中,然后将p的结点值加入结果res中,此时p指向其左子结点。否则如果p不存在的话,表明没有左子结点,我们取出栈顶结点,将p指向栈顶结点的右子结点。
*/
//算法实现:
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> s;
        TreeNode *p = root;
        while (!s.empty() || p) {
            if (p) {
                s.push(p);
                res.push_back(p->val);
                p = p->left;
            } else {
                TreeNode *t = s.top(); 
                s.pop();
                p = t->right;
            }
        }
        return res;
    }
};

 

以上是关于LeetCode144 二叉树的前序遍历的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode] 144. 二叉树的前序遍历

⭐算法入门⭐《二叉树》简单09 —— LeetCode 144. 二叉树的前序遍历

LeetCode Java刷题笔记—144. 二叉树的前序遍历

leetcode 144 二叉树的前序遍历

LeetCode144 二叉树的前序遍历

LeetCode 144. 二叉树的前序遍历