Binary Tree Inorder Traversal

来源:互联网 发布:最新版球球代点网源码 编辑:程序博客网 时间:2024/06/06 11:43
Given a binary tree, return the inorder traversal of its nodes' values.

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

return [1,3,2].

思路:二叉树中序遍历。如果节点不为NULL的话,先访问这个节点的left节点,再访问当前节点,最后访问right节点。

方法一:递归的方式来解决

/** * 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> inorderTraversal(TreeNode* root) {        vector<int>res;        if(!root)            return res;        inorder(root,res);        return res;    }    void inorder(TreeNode*root,vector<int>&res)    {        if(root)        {            inorder(root->left,res);            res.push_back(root->val);            inorder(root->right,res);        }    }    };
方法二:使用stack来进行

/** * 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> inorderTraversal(TreeNode* root) {        stack<TreeNode*>stk;        vector<int>res;        TreeNode *proot=root;        while(proot||!stk.empty())        {            if(proot)            {                stk.push(proot);                proot=proot->left;            }            else            {                proot=stk.top();                res.push_back(proot->val);                stk.pop();                proot=proot->right;            }        }        return res;    }};

方法三:使用morris遍历的方式。可以达到空间复杂度o(1).

/** * 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> inorderTraversal(TreeNode* root) {        //morris        vector<int>res;        TreeNode *cur=root,*pre=NULL;        while(cur)        {            if(cur->left==NULL)//如果当前节点的左子树为空,则输出当前节点,当前节点设置为节点的右子树的根节点            {                res.push_back(cur->val);                cur=cur->right;            }            else            {                pre=cur->left;                while(pre->right&&pre->right!=cur)                    pre=pre->right;                //pre 为当前节点在中序遍历下的前驱节点                if(pre->right==NULL)                {                    pre->right=cur;                    cur=cur->left;                }                else                {                    pre->right=NULL;                    res.push_back(cur->val);                    cur=cur->right;                }            }        }        return res;    }};




0 0
原创粉丝点击