树的排序分为前序遍历,中序遍历与后序遍历
前序遍历
void preorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
中序遍历
void inorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
inorderTraversal(root->left);
cout << root->val << " ";//输出当前节点的值
inorderTraversal(root->right);
}
后序遍历
void postorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val << " ";//输出当前节点的值
}
此外,还有一个层序遍历
void levelOrderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";//输出当前节点的值
if (node->left != nullptr) {
q.push(node->left);
}
if (node->right != nullptr) {
q.push(node->right);
}
}
}
举例一下
【力扣LCR 056】给定一个二叉搜索树的 根节点 root
和一个整数 k
, 请判断该二叉搜索树中是否存在两个节点它们的值之和等于 k
。假设二叉搜索树中节点的值均唯一。
我们可以先将树进行排序,再利用双指针解题,代码如下:
class Solution {
private:
public:
//中序遍历
void load_arr(TreeNode*root,vector<int>&arr){
if(! root) return;
load_arr(root->left,arr);
arr.push_back(root->val);
load_arr(root->right,arr);
}
bool findTarget(TreeNode* root, int k) {
vector<int> arr;
load_arr(root,arr);
//双指针
int l(0),r(arr.size()-1);
while(l<r){
int add= arr[l]+arr[r];
if(add==k)
return true;
add>k?r--:l++;
}
return false;
}
};