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].
Note: Recursive solution is trivial, could you do it iteratively?
我的AC代码,递归写法比较简单,所以试试迭代:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> nums;
stack<TreeNode *> stackNode;
while(root)
{
stackNode.push(root);
if (root->left != NULL)
{
root = root->left;
continue;
}
nums.push_back(root->val);
stackNode.pop();
if (root->right != NULL)
{
root = root->right;
continue;
}
TreeNode * node = root;
if (!stackNode.empty())
{
root = stackNode.top();
root->left = NULL;
stackNode.pop();
}
if (node == root)
break;
}
return nums;
}
};
利用递归栈的思路,自己维护一个栈,时间复杂度应该是O(n),空间复杂度O(n)。
看看AC后的详细细节:
运行时间是3ms。
不过我也写了一个递归版的:
class Solution {
public:
void helper(TreeNode* root, vector<int> & nums) {
if (root) {
helper(root->left, nums);
nums.push_back(root->val);
helper(root->right, nums);
}
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> nums;
helper(root, nums);
return nums;
}
};
这个运行结果感觉差不多:
完整的迭代算法:
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
class Tree {
public:
int val;
Tree * left;
Tree * right;
Tree() : val(), left(NULL), right(NULL) {}
void CreateTree(Tree * &root);
Tree* insert(Tree * root, int x);
void buildTree(Tree* root, vector<int> nums);
void inorderTraversal(Tree * root);
void iterative_inorderTraversal(Tree * root);
};
void Tree::CreateTree(Tree * &root)
{
int val;
cin >> val;
if (val == -1)
root = NULL;
else
{
root = new Tree;
root->val = val;
CreateTree(root->left);
CreateTree(root->right);
}
}
Tree* Tree::insert(Tree * root, int x)
{
Tree * node = new Tree;
node->val = x;
if (root == NULL)
{
root = node;
return root;
}
else if (root->left == NULL)
{
root->left = node;
return root;
}
else if (root->right == NULL)
{
root->right = node;
return root;
}
else
node->left = root;
return node;
}
void Tree::buildTree(Tree* root, vector<int> nums)
{
for (auto n : nums)
root = insert(root, n);
}
void Tree::inorderTraversal(Tree * root)
{
if (root != NULL)
{
inorderTraversal(root->left);
cout << root->val << ‘ ‘;
inorderTraversal(root->right);
}
}
void Tree::iterative_inorderTraversal(Tree * root)
{
stack<Tree *> stackNode;
while(root)
{
stackNode.push(root);
if (root->left != NULL)
{
root = root->left;
continue;
}
cout << root->val << ‘ ‘;
stackNode.pop();
if (root->right != NULL)
{
root = root->right;
continue;
}
Tree * node = root;
if (!stackNode.empty())
{
root = stackNode.top();
root->left = NULL;
stackNode.pop();
}
if (node == root)
break;
}
}
int main()
{
//vector<int> nums{ 1,2,3 };
Tree * root = NULL;
root->CreateTree(root);
//root->buildTree(root, nums);
root->inorderTraversal(root);
cout << endl;
root->iterative_inorderTraversal(root);
return 0;
}