结点定义
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) {}
};
前序遍历:
* 前序遍历 根->左->右
* @param root
* @param arr
*/
void inorderTraversalDlr(TreeNode* root,std::vector<int> &arr) {
if (root == nullptr){
return;
}
arr.push_back(root->val);
inorderTraversalDlr(root->left,arr);
inorderTraversalDlr(root->right,arr);
}
std::vector<int> inorderPre(TreeNode* root) {
std::vector<int> arr;
inorderTraversalDlr(root,arr);
return arr;
}
中序遍历:
* 中序遍历 左->根->右
* @param root
* @param arr
*/
void inorderTraversaLdr(TreeNode* root,std::vector<int> &arr) {
if (root == nullptr){
return;
}
inorderTraversaLdr(root->left,arr);
arr.push_back(root->val);
inorderTraversaLdr(root->right,arr);
}
std::vector<int> inorderMid(TreeNode* root) {
//中序遍历即按照访问左子树——根结点——右子树
std::vector<int> arr;
inorderTraversaLdr(root,arr);
return arr;
}
后序遍历:
/**
* 后序遍历 左->右->根
* @param root
* @param arr
*/
void inorderTraversalLrd(TreeNode* root,std::vector<int> &arr) {
if (root == nullptr){
return;
}
inorderTraversalLrd(root->left,arr);
inorderTraversalLrd(root->right,arr);
arr.push_back(root->val);
}
std::vector<int> inorderLst(TreeNode* root) {
std::vector<int> arr;
inorderTraversalLrd(root,arr);
return arr;
}
主函数:
int main()
{
Solution solution;
TreeNode treeNode1(1);
TreeNode treeNode2(2);
TreeNode treeNode3(3);
treeNode1.right = &treeNode2;
treeNode2.left = &treeNode3;
//中序遍历
vector<int> arr1 = solution.inorderMid(&treeNode1);
//前序遍历
vector<int> arr2 = solution.inorderPre(&treeNode1);
//后续遍历
vector<int> arr3 = solution.inorderLst(&treeNode1);
for (int i = 0;i<arr1.size();i++){
cout<<arr1[i]<<",";
}
cout<<"\n"<<endl;
for (int i = 0;i<arr2.size();i++){
cout<<arr2[i]<<",";
}
cout<<"\n"<<endl;
for (int i = 0;i<arr3.size();i++){
cout<<arr3[i]<<",";
}
cout<<"\n"<<endl;
}
运行结果:
1,3,2,
1,2,3,
3,2,1,