前序遍歷
中序遍歷
後序遍歷: 需要標記當前節點的狀態,有三種,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;
}