距离上次做题,好像过去了有快两个星期了吧,因为最近在看书和做项目,就没有去做题,到现在看完两本书了,想再回来编编程序,熟悉熟悉。而且最近有比较多的二叉树的例子,刚好这上面题目就是关于这方面的,所以就找到了这一题Binary Tree Preorder Traversal来做。题目描述如下:
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?
这道题相信看过二叉树的数据结构的都能写出其递归形式的代码,这里给出我的形式:
std::vector<int> preorderTraversal_Recursive(TreeNode *root)
{
std::vector<int> result,temp;
if(!root)
return result;
result.push_back(root->val);
temp = preorderTraversal(root->left);
result.insert(result.end(),temp.begin(),temp.end());
temp.clear();
temp = preorderTraversal(root->right);
result.insert(result.end(),temp.begin(),temp.end());
return result;
}
当然了,题目有另外一个提示说,能不能用迭代的方法去写。好像很多书上讲二叉树遍历都是用递归的,用迭代的比较少,刚好又可以再次熟悉一下。其实迭代的方法,就是将节点入栈,然后将栈中内容pop出来,再将其右儿子和左儿子先后放到栈里面,再继续出栈。就这样循环,直到栈为空。代码如下:
std::vector<int> preorderTraversal(TreeNode *root)
{
std::vector<int> result;
std::stack<TreeNode *> treeStack;
if (!root)
{
return result;
}
treeStack.push(root);
//when the stack is not empty, go loop
while(!treeStack.empty())
{
TreeNode *node = treeStack.top();
result.push_back(node->val);
treeStack.pop();
//right child first push into the stack
if (node->right)
{
treeStack.push(node->right);
}
if (node->left)
{
treeStack.push(node->left);
}
}
return result;
}
代码也是比较简单易懂,关键是要想到用栈这种数据结构去存储,还有入栈的顺序。