【LeetCode】144. Binary Tree Preorder Traversal

来源:互联网 发布:php网站代码大全 编辑:程序博客网 时间:2024/06/16 11:12

Difficulty: Medium

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

For example:
Given binary tree {1,#,2,3},

   1    \     2    /   3

return [1,2,3].

Note: Recursive solution is trivial, could you do it iteratively?

解法一:使用递归求解,判断当前根节点是否为空,先遍历当前子树的根节点,然后递归遍历当前节点的左子树,然后递归遍历当前节点的右子树。

/** * 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<int> preorderTraversal(TreeNode* root) {        if(root)        {        v.push_back(root->val);        preorderTraversal(root->left);        preorderTraversal(root->right);        }                return v;    }    private:    vector<int> v;};

一开始,我没有多想,一下子就把if那个条件判断写成了while,然后就TLE了,所以做题还是要想清楚每一步是怎么样的,不要想当然。


解法二:使用非递归的做法,先判断根节点是否为空,然后进行模拟先序访问,如果左子树非空,并且之前没有访问过,就访问左子树,然后访问右子树,也同样是要判断之前有没有访问过,每次访问将节点入栈,如果左子树和右子树都空,或者都访问过了,那么出栈。栈为空时访问结束。

class Solution {public:    vector<int> preorderTraversal(TreeNode* root) {    vector<int> v;    if(root==NULL)    return v;    else{    stack<TreeNode*> proc;    proc.push(root);    v.push_back(root->val);    map<TreeNode*,int> visit;    visit[root]=1;    while(!proc.empty())    {    TreeNode* node = proc.top();        if(node->left!=NULL && visit[node->left]!=1)    {    node=node->left;    visit[node]=1;    v.push_back(node->val);    proc.push(node);    }    else if(node->right!=NULL && visit[node->right]!=1)    {    node=node->right;    visit[node]=1;    v.push_back(node->val);    proc.push(node);    }    else{    proc.pop();    }    }    }            return v;    }        };



0 0
原创粉丝点击