zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    第六周作业
    2019第四周作业(基础作业+挑战作业)
    第三周作业
    2019第二周基础作业
    求最大值及下标值
    查找整数
    学期总结
    打印沙漏
    币值转换
    远程连接centos7的mysql5.7+ 更改iptables方法
  • 原文地址:https://www.cnblogs.com/parzulpan/p/10058982.html
Copyright © 2011-2022 走看看