Binary Tree Pre In Post Order Traversal二叉樹前序中序後序遍歷

前序遍歷
中序遍歷
後序遍歷: 需要標記當前節點的狀態,有三種,0表示第一次加入到隊列中,1表示訪問過左子樹,2表示左右子樹訪問完畢。


#include
#include
#include
#include
#include
using namespace std;

/**

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

enum State{
noTraversed,
leftTraversed,
rightTraversed
};

class Solution {
public:
TreeNode* newBT(vector &nums){
if (nums.empty()) return NULL;

	vector<int>::iterator it = nums.begin();
	queue<TreeNode *> q;
	TreeNode * root = NULL, *node = NULL;
	root = new TreeNode(*it++);
	q.push(root);
	while (it != nums.end()){
		node = q.front();
		q.pop();
		node->left = new TreeNode(*it++);
		q.push(node->left);
		if (it == nums.end()) break; 
		node->right = new TreeNode(*it++);
		q.push(node->right);
	}
	return root;
}

void deleteBT(TreeNode* root){
	if (NULL == root) return;
	if (NULL == root->left && NULL == root->right) {
		delete root;
		return;
	}
	if (NULL != root->left) {
		deleteBT(root->left);
		root->left = NULL;
	}
	if (NULL != root->right){
		deleteBT(root->right);
		root->right = NULL;
	}
}

// 前序遍歷
vector preorderTraversal(TreeNode* root) {
vector vals;
stack<TreeNode *> s;

	if (NULL == root) return vals;
	s.push(root);
	while (!s.empty()) {
		TreeNode *node = s.top();
		s.pop();
		if (NULL != node){
			vals.push_back(node->val);
			s.push(node->right);
			s.push(node->left);
		}
	}

	return vals;
}

// 中序遍歷
vector inorderTraversal(TreeNode* root) {
vector vals;
stack<TreeNode *> s;

	if (NULL == root) return vals;
	s.push(root);
	while (!s.empty()) {
		while (s.top()) { 
			s.push(s.top()->left); 
		}
		s.pop();// pop NULL node
		if (!s.empty()){
			TreeNode *node = s.top();
			s.pop();
			vals.push_back(node->val);
			s.push(node->right);
		}
	}

	return vals;
}

// 後序遍歷
vector postorderTraversal(TreeNode* root) {
vector vals;
stack<TreeNode *> s;
stack c;

	if (NULL == root) return vals;
	s.push(root);
	c.push(noTraversed);
	TreeNode *node = NULL;
	while (!s.empty()) {
		if (noTraversed == c.top()){
			while (NULL != (node = s.top())) {
				c.pop(), c.push(leftTraversed);
				s.push(node->left), c.push(noTraversed);
			}
			s.pop(), c.pop();
		}
		if (!s.empty()){
			node = s.top();
			if (rightTraversed == c.top()) {
				vals.push_back(node->val);
				s.pop(), c.pop();
			}
			else if (leftTraversed == c.top()){
				c.pop(), c.push(rightTraversed);
				s.push(node->right), c.push(noTraversed);
			}
		}
	}

	return vals;
}

void printVec(vector<int> &nums) {
	for (int i = 0; i < nums.size(); i++){
		cout << nums[i] << ' ';
	}
	cout << endl;
}

};

int main() {
vector nums = {1,2,3,4,5,6,7,8,9,0};
Solution s;
TreeNode *root = s.newBT(nums);
s.printVec(s.preorderTraversal(root));
s.printVec(s.inorderTraversal(root));
s.printVec(s.postorderTraversal(root));
s.deleteBT(root);
return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章