定义:
三种序得出如下的遍历结果
前序遍历:ABDHIEJCFKG
中序遍历:HDIBEJAFKCG
后序遍历:HIDJEBKFGCA
思路
以下代码,只有前序是自己写出来的,其他都是看了人家的代码写的;题目说用递归很简单,可能是我从来没有写过递归的程序,一般都是能用for绝不再想用扫描递归。看完了中序和后序的程序,然后自己憋出来前序的程序。其实发现就用一个3个节点组成的二叉树来想,不然太多层想递归会脑阔痛。前序主要就是考虑了顺序是由根往左下再往右。从上往下扫描的时候,把左支和右支分布记录下来v1、v2;再用push_back和insert依照根->左->右顺序拼接起来。三种序的返回条件都是看有没有扫描到底了,就是root是否为NULL。
前序
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/*
vector的insert方式:(以下为将vec1和vec2的内容合并到vec3中)
vector<string>vec1,vec2,vec3;
//... vec1,vec2赋值
vec3.insert(vec3.end(),vec1.begin(),vec1.end());
vec3.insert(vec3.end(),vec2.begin(),vec2.end());
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> v;
if (root == NULL) {
return v;
}
vector<int> v1,v2,v3;
v1 = preorderTraversal(root->left);
v2 = preorderTraversal(root->right);
v3.push_back(root->val);
v3.insert(v3.end(),v1.begin(),v1.end());
v3.insert(v3.end(),v2.begin(),v2.end());
return v3;
}
};
中序c++
中序
左->根->右
的顺序,详细顺序可理解为最低层的子树按“左根右”顺序排列得到一个上一层的”左“,依次这样下去。
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> resVector;
vector<int> inorderTraversal(TreeNode* root) {
if(root != NULL){
inorderTraversal(root->left);
resVector.push_back(root->val);
inorderTraversal(root->right);
}
return resVector;
}
};
后序
左->右->根
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> v;
if (!root)
return v;
vector<int> left = postorderTraversal(root->left);
if (!left.empty()) {
for (auto i:left)
v.push_back(i);
}
vector<int> right = postorderTraversal(root->right);
if (!right.empty()) {
for (auto i:right)
v.push_back(i);
}
v.push_back(root->val);
return v;
}
};