转载请注明:http://blog.csdn.net/ict2014/article/details/17500111
原题如下:
题目解析:
这道题目是“二叉树的前序遍历”。通常有两种做法,递归求解以及循环求解。
递归求解,较为简单,先访问当前节点、访问左孩子结点、在访问右孩子节点。详细可参照如下代码。
循环求解,较为麻烦。但是相对于递归求解而言,这种方法耗费的函数栈空间更小,并且省去了大量的函数调用时间的开销,速度更加快,只不过程序不如递归求解的美丽客观。循环求解,需要使用一个栈保存已经访问过的数据,以便于对节点的右孩子结点进行访问。当面对一个节点的时候,我们有两种选择:
第一:该节点不为空,访问该节点,并且压入左子树
第二:该节点为空,抛出该点。如果当前栈不为空,则抛出一个节点,压入其右子树。
题目代码:
/**
* 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> preorderTraversal(TreeNode *root) {
vector<int> pre_order;
if(root == NULL){
return pre_order;
}
PreorderIterative(root, pre_order);
return pre_order;
}
//recursively implementation
void PreorderRecursive(TreeNode* root,
vector<int>& result){
if(root == NULL){
return;
}
//visit the root node
result.push_back(root->val);
//visit left child tree
PreorderRecursive(root->left, result);
//visit right child tree
PreorderRecursive(root->right, result);
}
//iteratively implementation
void PreorderIterative(TreeNode* root,
vector<int>& result){
if(root == NULL){
return;
}
//keep the visited nodes
stack<TreeNode*> datas;
datas.push(root);
TreeNode* top;
while(!datas.empty()){
top = datas.top();
//current node is not null
//visit the current node
if(top != NULL){
result.push_back(top->val);
datas.push(top->left);
}else{
//pop the NULL node
datas.pop();
//the stack is not empty
//pop the top visited node
//push its right child
if(!datas.empty()){
top = datas.top();
datas.pop();
datas.push(top->right);
}
}
}
}
};