标签:
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?
//采用二叉树前序遍历的方法来做*********************************** #include<iostream> #include<vector> using namespace std; //二叉树的定义 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x=‘#‘) : val(x), left(NULL), right(NULL) {} }; //采用前序遍历的方法来做。 void print_val(TreeNode* node,vector<int>& result) { if(node!=NULL) result.push_back(node->val); else return; print_val(node->left,result); print_val(node->right,result); return; } vector<int> preorderTraversal(TreeNode *root) { vector<int> last_result; print_val(root,last_result); return last_result; } int main(int argc,char** argv) { system("pause"); return 1; }
/* 这道题目是“二叉树的前序遍历”。通常有两种做法,递归求解以及循环求解。 递归求解,较为简单,先访问当前节点、访问左孩子结点、在访问右孩子节点。 详细可参照如下代码。 循环求解,较为麻烦。但是相对于递归求解而言,这种方法耗费的函数栈空间更小, 并且省去了大量的函数调用时间的开销,速度更加快, 只不过程序不如递归求解的美丽客观。循环求解,需要使用一个栈保存已经访问过的数据 ,以便于对节点的右孩子结点进行访问。当面对一个节点的时候,我们有两种选择: 第一:该节点不为空,访问该节点,并且压入左子树 第二:该节点为空,抛出该点。如果当前栈不为空,则抛出一个节点,压入其右子树。 */ #include<iostream> #include<vector> #include<stack> using namespace std; //二叉树的定义 struct TreeNode { char val; TreeNode *left; TreeNode *right; TreeNode(int x=‘#‘) : val(x), left(NULL), right(NULL) {} }; // vector<int> preorderTraversal(TreeNode *root) { vector<int> result;//输出结果的vector stack<TreeNode*> temp;//使用的栈 TreeNode* temp_node;//临时变量 if(root!=NULL) { temp.push(root);//开始将根节点压入到栈中 } else return result; // now_node=now_node->left; while(!temp.empty()) { if(temp.top()!=NULL)//第一:该节点不为空,访问该节点,并且压入左子树 { result.push_back(temp.top()->val); temp.push(temp.top()->left); } else//第二:该节点为空,抛出该点。如果当前栈不为空,则抛出一个节点,压入其右子树。 { temp.pop(); if(!temp.empty()) { temp_node=temp.top(); temp.pop(); temp.push(temp_node->right); } } } } int main(int argc,char** argv) { system("pause"); return 1; }
leetcode——Binary Tree Preorder Traversal(递归,栈的使用)
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4414663.html