1. 程式人生 > 實用技巧 >二叉樹非遞迴遍歷

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷

1 前序遍歷

void preorder(TreeNode *root, vector<int>& res)
{
	stack< pair<TreeNode*, bool> > s;
	s.push(make_pair(root, false));
	bool visited;
	while(!s.empty()) {
		root = s.top().first;
		visited = s.top().second;
		s.pop();
		if(root == NULL) {
			continue;
		}
		if(visited) {
			res.push_back(root->val);
		} else {
			s.push(make_pair(root->right, false));
			s.push(make_pair(root->left, false));
			s.push(make_pair(root, true));
		}
	}
}

2 中序遍歷

void inorder(TreeNode *root, vector<int>& res)
{
	stack< pair<TreeNode*, bool> > s;
	s.push(make_pair(root, false));
	bool visited;
	while(!s.empty()) {
		root = s.top().first;
		visited = s.top().second;
		s.pop();
		if(root == NULL) {
			continue;
		}
		if(visited) {
			res.push_back(root->val);
		} else {
			s.push(make_pair(root->right, false));
			s.push(make_pair(root, true));
			s.push(make_pair(root->left, false));
		}
	}
}

3 後序遍歷

void postorder(TreeNode *root, vector<int>& res)
{
	stack< pair<TreeNode*, bool> > s;
	s.push(make_pair(root, false));
	bool visited;
	while(!s.empty()) {
		root = s.top().first;
		visited = s.top().second;
		s.pop();
		if(root == NULL) {
			continue;
		}
		if(visited) {
			res.push_back(root->val);
		} else {
			s.push(make_pair(root, true));
			s.push(make_pair(root->right, false));
			s.push(make_pair(root->left, false));
		}
	}
}