バイナリ ツリーの事前順序走査 (左と右)
事前順序トラバーサルは、最初にルート ノードにアクセスし、次に左側のサブツリーにアクセスし、最後に右側のサブツリーにアクセスするトラバーサル方法を指します。再帰的な実装
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* @param root TreeNode类
* @return int整型vector
*/
vector<int> vec;
vector<int> preorderTraversal(TreeNode* root) {
if(root!=NULL){
vec.push_back(root->val);
// cout<<root->val<<" ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
return vec;
}
};
バイナリ ツリーの順序トラバース (左ルート右)
インオーダートラバーサルとは、最初に左側のサブツリーにアクセスし、次にルートノードにアクセスし、最後に右側のサブツリーにアクセスすることを意味します。再帰またはスタックを使用して実装する
再帰的な実装
#include <vector>
class Solution {
public:
vector<int> vec;
vector<int> inorderTraversal(TreeNode* root) {
// 递归
if(root!=NULL){
inorderTraversal(root->left);
vec.push_back(root->val);
inorderTraversal(root->right);
}
return vec;
}
};
スタックの実装
// 栈(先进后出)
void inorderTree(TreeNode *root){
stack<TreeNode*> s;
TreeNode* t=root;
while(t || !s.empty()){
while(t){
s.push(t);// 根节点先进栈
t=t->left;// 左边的元素都进栈后,开始出栈
}
t = s.top();
s.pop();
cout << t->val << " ";
t=t->right;//右边的元素进栈
}
}
二分木の事後走査 (左ルートと右ルート)
事後走査:最初に左側のノードを走査し、次に右側のノードを走査し、最後にルート ノードを走査します。再帰
#include <vector>
class Solution {
public:
vector<int> vec;
vector<int> postorderTraversal(TreeNode* root) {
if(root){
postorderTraversal(root->left);
postorderTraversal(root->right);
vec.push_back(root->val);
}
return vec;
}
};
二分木のレベル順序の探索を見つける
BFS
#include <queue>
#include <vector>
class Solution {
public:
/**
* @param root TreeNode类
* @return int整型vector<vector<>>
*/
vector<vector<int> > levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(!root) return res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
vector<int> level;
for(int i=q.size(); i>0; i--){
TreeNode* t=q.front(); q.pop();
level.push_back(t->val);
if(t->left)q.push(t->left);
if(t->right)q.push(t->right);
}
res.push_back(level);
}
return res;
}
};