94. Binary Tree Inorder Traversal

来源:互联网 发布:东三环java培训 编辑:程序博客网 时间:2024/05/01 21:31

题目:

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

For example:
Given binary tree [1,null,2,3],

   1    \     2    /   3

return [1,3,2].

解法:

Hi, this is a fundamental and yet classic problem. I share my three solutions here:

  1. Iterative solution using stack --- O(n) time and O(n) space;
  2. Recursive solution --- O(n) time and O(n) space (considering the spaces of function call stack);
  3. Morris traversal --- O(n) time and O(1) space!!!

Iterative solution using stack:

vector<int> inorderTraversal(TreeNode* root) {    vector<int> nodes;    stack<TreeNode*> toVisit;    TreeNode* curNode = root;    while (curNode || !toVisit.empty()) {        if (curNode) {            toVisit.push(curNode);            curNode = curNode -> left;        }        else {            curNode = toVisit.top();            toVisit.pop();            nodes.push_back(curNode -> val);            curNode = curNode -> right;        }    }    return nodes;}

Recursive solution:

void inorder(TreeNode* root, vector<int>& nodes) {    if (!root) return;    inorder(root -> left, nodes);    nodes.push_back(root -> val);    inorder(root -> right, nodes);}vector<int> inorderTraversal(TreeNode* root) {    vector<int> nodes;    inorder(root, nodes);    return nodes;} 

Morris traversal:

vector<int> inorderTraversal(TreeNode* root) {    TreeNode* curNode = root;    vector<int> nodes;    while (curNode) {        if (curNode -> left) {            TreeNode* predecessor = curNode -> left;            while (predecessor -> right && predecessor -> right != curNode)                predecessor = predecessor -> right;            if (!(predecessor -> right)) {                predecessor -> right = curNode;                curNode = curNode -> left;            }            else {                predecessor -> right = NULL;                nodes.push_back(curNode -> val);                curNode = curNode -> right;            }        }        else {            nodes.push_back(curNode -> val);            curNode = curNode -> right;        }    }    return nodes;}



0 0
原创粉丝点击