无论是递归方法还是非递归方法,时间复杂度为O(N),N为二叉树节点个数。额外空间复杂度为O(L),L为二叉树的层数。
递归方法实现前序、中序、后序遍历
注意vector<int>result进行引用传递的做法:
引用传递
方法1:
void DLR(vector<int> & result2){
...//此函数修改result2,主函数中result会有同样的改变
result2.push_back(val1);//调用push_back方法用'.'
}
int main(){
vector<int>result;
DLR(result);//调用函数
}
方法2:
void DLR(vector<int> * result2){
...//此函数修改result2,主函数中result会有同样的改变
//调用push_back方法用'->'
result2->push_back(val2);
}
int main(){
vector<int>result;
DLR(&result);//调用函数
}
值传递情况下,对形参的修改不会影响实参
值传递
void DLR(vector<int> result2){
...//此函数修改result2,主函数中result会有同样的改变
result2.push_back(val1);//调用push_back方法用'.'
}
int main(){
vector<int>result;
DLR(result);//调用函数后result1仍为null
}
代码实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class TreeToSequence {
public:
void DLR(vector<int>& result1,TreeNode* root)//先序遍历
{
if(root == NULL){
return;
}
result1.push_back(root->val);
DLR(result1,root->left);
DLR(result1,root->right);
}
void LDR(vector<int>& result2,TreeNode* root)//中序遍历
{
if(root == NULL){
return;
}
LDR(result2,root->left);
result2.push_back(root->val);
LDR(result2,root->right);
}
void LRD(vector<int>& result3,TreeNode* root)//后序遍历
{
if(root == NULL){
return;
}
LRD(result3,root->left);
LRD(result3,root->right);
result3.push_back(root->val);
}
vector<vector<int> > convert(TreeNode* root) {
// write code here
vector <vector<int>> result;
vector<int>result1;
vector<int>result2;
vector<int>result3;
DLR(result1,root);
LDR(result2,root);
LRD(result3,root);
result.push_back(result1);
result.push_back(result2);
result.push_back(result3);
return result;
}
};