Binary Tree Inorder Traversal

来源:互联网 发布:淘宝怎么样刷信誉 编辑:程序博客网 时间:2024/05/21 11:06

1. 递归解法

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<int> result;    void inorder(TreeNode *root)    {        if (root == NULL)            return;        inorder(root->left);        result.push_back(root->val);        inorder(root->right);    }    vector<int> inorderTraversal(TreeNode *root) {        result.clear();        inorder(root);        return result;    }};

2. 非递归解法(空间复杂度O(n))

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<int> inorderTraversal(TreeNode *root) {        vector<int> path;        stack<TreeNode *> st;        if (root == NULL)            return path;        TreeNode *p = root;        while (p != NULL || !st.empty())        {            while (p != NULL)            {                st.push(p);                p = p->left;            }            if (!st.empty())            {                p = st.top();                st.pop();                path.push_back(p->val);                p = p->right;            }        }        return path;    }};

3. 非递归解法(空间复杂度O(1))

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<int> inorderTraversal(TreeNode *root) {        vector<int> path;        if (root == NULL)            return path;                    TreeNode *cur = root;        TreeNode *pre = NULL;        while (cur != NULL)        {            if (cur->left == NULL)            {                path.push_back(cur->val);                cur = cur->right;            }            else            {                pre = cur->left;                while (pre->right != NULL && pre->right != cur)                    pre = pre->right;                if (pre->right == NULL)                {                    pre->right = cur;                    cur = cur->left;                }                else                {                    pre->right = NULL;                    path.push_back(cur->val);                    cur = cur->right;                }            }        }        return path;    }};

3 0
原创粉丝点击