码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode144 二叉树的前序遍历

时间:2018-12-03 16:31:44      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:data-   算法实现   style   效率   tree   递归算法   etc   order   使用   

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

 示例:

输入: [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 二叉树的前序遍历

标签:data-   算法实现   style   效率   tree   递归算法   etc   order   使用   

原文地址:https://www.cnblogs.com/parzulpan/p/10058982.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!