码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode——Binary Tree Preorder Traversal(递归,栈的使用)

时间:2015-04-10 16:56:27      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!