[LeetCode]144.Binary Tree Preorder Traversal

来源:互联网 发布:工频变压器设计软件 编辑:程序博客网 时间:2024/05/22 10:31

【题目】

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?

【代码一】

/**********************************   日期:2014-10-15*   作者:SJF0115*   题号: 144.Binary Tree Preorder Traversal*   来源:https://oj.leetcode.com/problems/binary-tree-preorder-traversal/*   结果:AC*   来源:LeetCode*   总结:**********************************/#include <iostream>#include <malloc.h>#include <vector>using namespace std;struct TreeNode {    int val;    TreeNode *left;    TreeNode *right;    TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution {public:    vector<int> v;    void PreOrder(TreeNode *root){        if (root == NULL){            return;        }        v.push_back(root->val);        PreOrder(root->left);        PreOrder(root->right);    }    vector<int> preorderTraversal(TreeNode *root) {        PreOrder(root);        return v;    }};//按先序序列创建二叉树int CreateBTree(TreeNode* &T){    char data;    //按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树    cin>>data;    if(data == '#'){        T = NULL;    }    else{        T = (TreeNode*)malloc(sizeof(TreeNode));        //生成根结点        T->val = data-'0';        //构造左子树        CreateBTree(T->left);        //构造右子树        CreateBTree(T->right);    }    return 0;}int main() {    Solution solution;    TreeNode* root(0);    CreateBTree(root);    vector<int> v = solution.preorderTraversal(root);    for(int i = 0;i < v.size();i++){        cout<<v[i]<<endl;    }}

【代码二】

非递归实现

class Solution {public:    vector<int> preorderTraversal(TreeNode *root) {        vector<int> v;        stack<TreeNode*> s;        TreeNode* p = root;        //栈不空或者p不空时循环        while(p != NULL || !s.empty()){            if(p != NULL){                //访问根节点                v.push_back(p->val);                //根节点插入栈中,用来访问右子树                s.push(p);                //遍历左子树                p = p->left;            }            else{                //左子树访问完毕,访问右子树                p = s.top();                s.pop();                p = p->right;            }        }        return v;    }};


【代码三】

/*------------------------------------------------*   日期:2015-03-25*   作者:SJF0115*   题目: 144.Binary Tree Preorder Traversal*   来源:https://oj.leetcode.com/problems/binary-tree-preorder-traversal/*   结果:AC*   来源:LeetCode*   博客:------------------------------------------------------*/#include <iostream>#include <stack>#include <vector>using namespace std;// 二叉树节点结构struct TreeNode{    int val;    TreeNode *left;    TreeNode *right;    TreeNode(int x):val(x),left(nullptr),right(nullptr){}};class Solution {public:    vector<int> preorderTraversal(TreeNode *root) {        vector<int> result;        if(root == nullptr){            return result;        }//if        stack<TreeNode*> s;        s.push(root);        TreeNode *node;        while(!s.empty()){            node = s.top();            s.pop();            result.push_back(node->val);            // 右子树            if(node->right){                s.push(node->right);            }//if            // 左子树            if(node->left){                s.push(node->left);            }//if        }//while        return result;    }};// 1.创建二叉树void CreateTree(TreeNode* &root){    int val;    //按先序次序输入二叉树中结点的值,‘-1’表示空树    cin>>val;    // 空节点    if(val == -1){        root = nullptr;        return;    }//if    root = new TreeNode(val);    //构造左子树    CreateTree(root->left);    //构造右子树    CreateTree(root->right);}int main() {    freopen("C:\\Users\\Administrator\\Desktop\\c++.txt", "r", stdin);    TreeNode* root = nullptr;    vector<int> result;    // 创建二叉树    CreateTree(root);    Solution solution;    result = solution.preorderTraversal(root);    for(int i = 0;i < result.size();++i){        cout<<result[i]<<" ";    }    cout<<endl;    return 0;}






1 0