首先是二叉树的常规定义。
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
前序遍历 leetcode 144
算法流程:
root -> left -> right
代码实现
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode *> s1;
vector<int> preorderVisit;
if(root==NULL) return preorderVisit;
TreeNode *temp = root;
s1.push(temp);
while(!s1.empty()){
temp = s1.top();
s1.pop();
preorderVisit.push_back(temp->val);
if(temp->right!=NULL) s1.push(temp->right);
if(temp->left!=NULL) s1.push(temp->left);
}
return preorderVisit;
}
中序遍历 leetcode 94
算法流程:
left -> root -> right
代码实现
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode *> inorderStack;
vector<int> valueMidVisit;
TreeNode *temp = root;
while(temp!=NULL || !inorderStack.empty()){
while(temp!=NULL){
inorderStack.push(temp);
temp = temp->left;
}
temp = inorderStack.top();
valueMidVisit.push_back(temp->val);
temp = temp->right;
inorderStack.pop();
}
return valueMidVisit;
}
后序遍历 leetcode 145
算法流程:
left -> right -> root
代码实现
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode *> s1;
stack<int> s2; // 0 为 l,1 为 r。
TreeNode *temp = root;
vector<int> visitList;
int node_flag;
do{
while(temp != NULL){
s1.push(temp);
s2.push(0);
temp = temp->left;
}
int flag = 1;
while(flag && !s1.empty()){
temp = s1.top();
node_flag = s2.top();
s1.pop();
s2.pop();
if(node_flag==1){ // r visit
visitList.push_back(temp->val);
}
else if(node_flag==0){
s1.push(temp);
s2.push(1);
flag = 0;
temp = temp->right;
}
}
}while(!s1.empty());
return visitList;
}
层序遍历 leetcode 102
算法流程:
代码实现
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode *> q;
q.push(root);
int all_num = 1;
int pop_num = 0;
int num_last = 1;
vector<vector<int>> levelOrderList;
if(root==NULL) return levelOrderList;
vector<int> temp_levelOrder;
while (!q.empty()) {
TreeNode* temp = q.front();
q.pop();
temp_levelOrder.push_back(temp->val);
pop_num++;
if(temp->left!=NULL) {
q.push(temp->left);
all_num++;
}
if(temp->right!=NULL){
q.push(temp->right);
all_num++;
}
if(num_last == pop_num){ // next_vector
levelOrderList.push_back(temp_levelOrder);
temp_levelOrder.clear();
num_last = all_num;
}
}
return levelOrderList;
}