树的代码实现以及遍历,后续再补充
#include<iostream>
#include<queue>
using namespace std;
class treeNode{
public:
int val;
treeNode *left,*right;
treeNode()
{
left=NULL;
right=NULL;
}
};
treeNode* build(treeNode* root,int val)
{
if(root==NULL)
{
root=new treeNode();
root->val=val;
}
if(val<root->val)
root->left=build(root->left,val);
else if(val>root->val)
root->right=build(root->right,val);
return root;
}
void levelOrder(treeNode* root){
queue<treeNode*> q;
q.push(root);
while(!q.empty()){
treeNode *temp = q.front();
q.pop();
cout<<temp->val<<" ";
if(temp->left) q.push(temp->left);
if(temp->right) q.push(temp->right);
}
}
void lvrOrder(treeNode* root){
if(root!=NULL)
{
// if(root->left)
// cout<<"left ="<<root->left->val<<endl;
cout<<"node ="<<root->val<<endl;
// if(root->right)
// cout<<"right ="<<root->right->val<<endl;
lvrOrder(root->left);
cout<<root->val<<" ";
lvrOrder(root->right);
}
}
void vlrOrder(treeNode* root){
if(root!=NULL)
{
cout<<root->val<<" ";
vlrOrder(root->left);
vlrOrder(root->right);
}
}
void lrvOrder(treeNode* root){
if(root!=NULL)
{
vlrOrder(root->left);
vlrOrder(root->right);
cout<<root->val<<" ";
}
}
int main()
{
treeNode *root = NULL;
int t[] = {4,2,6,1,3,5,7};
for(int i = 0; i < 7; i++) root = build(root, t[i]);
levelOrder(root);
cout<<endl;
lvrOrder(root);
cout<<endl;
vlrOrder(root);
cout<<endl;
lrvOrder(root);
cout<<endl;
return 0;
}
1、递归就是函数调用函数本身,运行起来就是函数嵌套函数,层层嵌套,所以函数调用、参数堆栈都是不小的开销,但是程序简单。
2、非递归就是不断地对参数入栈、出栈,省去了函数层层展开、层层调用的开销。虽然参数出入栈次数多了,但是一般都开辟固定的足够大的内存来一次性开辟、重复使用。
3、非递归是从堆栈的角度来编写程序,速度快,但代码复杂。
递归是从问题本身的逻辑角度来编写,虽然速度相对慢,但代码容易理解。
如果对速度要求不高,建议用递归方式。(来自百度知道总结)