看了一遍感觉没有啥特别难的地方,就是一些基础的内容,要熟练掌握。
二叉树的递归遍历整体代码比较简洁,前中后序就是中间三行的代码顺序交换了一下。
class Solution {
public:
void Traversal(TreeNode* root,vector<int>& result){
if(root==NULL)return;
result.push_back(root->val);
Traversal(root->left,result);
Traversal(root->right,result);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
Traversal(root,result);
return result;
}
};
二叉树的前序遍历:首先先定义一个栈,数据类型为treenode*,再定义一个整型数组result,用于返回结果。如果根为空则直接返回root,否则就将root压栈进入栈中。接着用while循环遍历二叉树,循环的条件为二叉树始终不为空。先获取栈顶元素,再让栈顶元素出栈。再让此时栈顶元素的数值进入result数组,然后再分别让右,左元素进入栈中即可,注意顺序是右左而不是左右,因为栈后进先出的性质,入栈顺序是右左则进行出栈处理的时候处理顺序即为左右。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> result;
if(!root)return result;
s.push(root);
while(!s.empty()){
TreeNode* t=s.top();
s.pop();
result.push_back(t->val);
if(t->right)s.push(t->right);
if(t->left)s.push(t->left);
}
return result;
}
};
二叉树的后序遍历:大致思路和前序遍历差不多。前序遍历是根左右,后序遍历为左右根,思路如下:前序遍历是先处理根,再让右孩子进栈,再让左孩子进栈。后序遍历先调整左右孩子进展顺序,最终得到的结果是根右左,再使用reverse数组让整个结果反转为左右根即为正确答案。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> result;
if(!root)return result;
s.push(root);
while(!s.empty()){
TreeNode* t=s.top();
s.pop();
result.push_back(t->val);
if(t->left)s.push(t->left);
if(t->right)s.push(t->right);
}
reverse(result.begin(),result.end());
return result;
}
};
二叉树的中序遍历:此时不能再和中序遍历一样简单修改几行代码,因为前序遍历和后序遍历的遍历顺序和处理顺序是同步的,但是中序遍历的遍历顺序和处理顺序是不同步的因此要重新设计。大致思路:首先先定义一个整型数组result,一个TreeNode*类型的栈,再定义一个指针cur,让cur等于root。用while循环遍历数组,循环条件是栈不为空或者cur不指向空。假如cur不指向null,就让cur指向的元素入栈,cur继续往左边走,假如指向空了,说明走到最左边了,这个时候就应该对cur指向的上一个元素进行操作,也就是栈顶元素。让栈顶元素等于cur,再让栈顶元素出栈,cur指向的数值进入result数组,此时左根右中完成了左和根,再让cur往右走,以此循环。
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> s;
TreeNode* cur;
cur=root;
while(cur!=NULL||s.empty()==false){
if(cur!=NULL){
s.push(cur);
cur=cur->left;
}
else{
cur=s.top();
s.pop();
result.push_back(cur->val);
cur=cur->right;
}
}
return result;
}
};
思路:定义一个二维数组result来返回,然后定义一个队列q用于层序遍历的过程进行数据的处理。用while循环进行层序遍历。循环条件为q不为空队列。先用一个变量size记录此时队列长度(不能直接用q.size()函数因为后面的for循环长度一直在变化),然后建立一个vec整型数组储存当前这一层的结果。然后用for循环遍历这一层。这一轮循环结束后vec数组进入result数组中,while循环结束即为遍历结束。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
queue<TreeNode*> q;
if(root)q.push(root);
while(q.empty()==false){
int size=q.size();
vector<int> vec;
for(int i=0;i<size;i++){
TreeNode* node=q.front();
q.pop();
vec.push_back(node->val);
if(node->left)q.push(node->left);
if(node->right)q.push(node->right);
}
result.push_back(vec);
}
return result;
}
};