二叉樹的前中後序遍歷遞歸與迭代

/**
 * Definition for a binary tree node.
 * 
 */
struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

前序遍歷

/*
* 前序遍歷(遞歸+迭代)
*/
class PreorderTraveRecur {
public:
	vector<int> preorderTraversal(TreeNode* root) {
		vector<int>data;
		helper(root, data);
		return data;
	}
	void helper(TreeNode*root, vector<int>&data) {

		if (root != NULL) {
			data.push_back(root->val);
			if (root->left != NULL) {
				helper(root->left, data);
			}
			if (root->right != NULL) {
				helper(root->right, data);
			}
		}
	}
};

class PreorderTravIter {
public:
	vector<int> preorderTraversal(TreeNode* root) {

		vector<int>data;
		stack<TreeNode*> sk;
		TreeNode*curr = root;

		while (curr != NULL || !sk.empty()) {

			while (curr != NULL) {

				data.push_back(curr->val);
				sk.push(curr);
				curr = curr->left;
			}
			if (!sk.empty()) { //

				curr = sk.top();
				sk.pop();
				curr = curr->right;
			}
		}
		return data;
	}
};

中序遍歷

/*
* 中序遍歷(遞歸+迭代)
*/
class InorderTraveRecur {
	
public:
	vector<int> inorderTraversal(TreeNode* root) {
		vector<int>data;
		helper(root, data);
		return data;
	}

	void helper(TreeNode*root, vector<int>&data) {
		if (root != NULL) {
			if (root->left != NULL) {
				helper(root->left, data);
			}
			data.push_back(root->val);
			if (root->right != NULL) {
				helper(root->right, data);
			}
		}
	}
};

class InorderTraveIter {

public:
	vector<int> inorderTraversal(TreeNode* root) {

		vector<int>data;
		stack<TreeNode*> sk;
		TreeNode*curr = root;

		while (curr != NULL||!sk.empty()) {

			while(curr != NULL) {
				sk.push(curr);
				curr = curr->left;
			}

			if (!sk.empty()) { //
				curr = sk.top();
				sk.pop();
				data.push_back(curr->val);
				curr = curr->right;
			}
		}
		return data;
	}

	
};

後序遍歷

/*
* 後序遍歷(遞歸+迭代)
*/
class PostorderTravRecur {
public:
	vector<int> postorderTraversal(TreeNode* root) {
		vector<int>data;
		helper(root, data);
		return data;
	}
	void helper(TreeNode*root, vector<int>&data) {
		if (root != NULL) {
			if (root->left != NULL) {
				helper(root->left, data);
			}
			if (root->right != NULL) {
				helper(root->right, data);
			}
			data.push_back(root->val);
		}
	}
};

class PostorderTravIter {
public:
	vector<int> postorderTraversal(TreeNode* root) {
		vector<int>data;
		stack<pair<TreeNode*,bool>> sk;//加一個訪問標誌
		TreeNode*curr = root;

		while (curr != NULL || !sk.empty()) {

			while (curr != NULL) {
				sk.push(make_pair(curr,true));
				curr = curr->left;
			}

			if (!sk.empty()) { 

				pair<TreeNode*, bool> p = sk.top();
				sk.pop();
				if (p.second) {//表示是第一次出現在棧頂(緩衝一步)
					sk.push(make_pair(p.first, false));
					curr = p.first->right;
				}
				else {
					data.push_back(p.first->val);
					curr = NULL;
				}
			}
		}
		return data;
	}
	
};

統一的迭代遍歷



//非遞歸前序遍歷
vector<int> preorderTraversal(TreeNode *root)
{
	vector<int> path;
	stack< pair<TreeNode *, bool> > s;
	TreeNode* curr = root;
	s.push(make_pair(curr, false));

	while (!s.empty())
	{
		pair<TreeNode *, bool>p = s.top();
		curr =p.first;
		s.pop();
		if (curr== NULL)
			continue;
		if (p.second)
		{
			path.push_back(curr->val);
		}
		else
		{
			s.push(make_pair(curr->right, false));
			s.push(make_pair(curr->left, false));
			s.push(make_pair(curr, true));
		}
	}
	return path;
}

//非遞歸中序遍歷
vector<int> inorderTraversal(TreeNode *root)
{
	vector<int> path;
	stack< pair<TreeNode *, bool> > s;
	TreeNode* curr = root;
	s.push(make_pair(curr, false));

	while (!s.empty())
	{
		pair<TreeNode *, bool>p = s.top();
		curr = p.first;
		s.pop();
		if (curr == NULL)
			continue;
		if (p.second)
		{
			path.push_back(curr->val);
		}
		else
		{
			s.push(make_pair(curr->right, false));
			s.push(make_pair(curr, true));
			s.push(make_pair(curr->left, false));
		}
	}
	return path;
}
//非遞歸後序遍歷
vector<int> postorderTraversal(TreeNode *root)
{
	vector<int> path;
	stack< pair<TreeNode *, bool> > s;
	TreeNode* curr = root;
	s.push(make_pair(curr, false));

	while (!s.empty())
	{
		pair<TreeNode *, bool>p = s.top();
		curr = p.first;
		s.pop();
		if (curr == NULL)
			continue;
		if (p.second)
		{
			path.push_back(curr->val);
		}
		else
		{
			s.push(make_pair(curr, true));
			s.push(make_pair(curr->right, false));
			s.push(make_pair(curr->left, false));
		}
	}
	return path;
}

發佈了34 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章