二叉樹——遞歸法
建立樹時,按照左子樹小於樹根,右子樹大於樹根,這樣中序遍歷就是有序表
#include<iostream>
using namespace std;
class node //樹節點定義
{
public:
int data; //元素值
node *parent; //父節點
node *left; //左子節點
node *right; //右子節點
public:
// node():data(-1),parent(NULL),left(NULL),right(NULL){};
node(int num):data(num),parent(NULL),left(NULL),right(NULL){}; //構造函數,初始化類成員變量
};
class tree //樹定義
{
public:
tree(int num[],int len); //構造函數
void insertNode(int data); //安左低右高插入樹的節點
void preOrderTree(); //前序
void inOrderTree(); //中序
void postOrderTree(); //後序
private:
void insertNode(node *root,int data); //插入遞歸
void preOrderTree(node *current); //前序遞歸
void inOrderTree(node *current); //中序遞歸
void postOrderTree(node *current); //後序遞歸
node *root; //樹的根節點
};
tree::tree(int num[],int len) //構造函數
{
root=new node(num[0]);
for(int i=1;i<len;i++)
insertNode(num[i]); //調用插入函數
}
void tree::insertNode(int data)
{
if(root!=NULL)
insertNode(root,data);
}
void tree::insertNode(node *current,int data) //遞歸插入函數樹節點函數
{
if(data<= current->data)
{
if(current->left==NULL)
{
current->left =new node(data);
current->left->parent=current;
}
else
insertNode(current->left,data);
}
else if(data> current->data)
{
if(current->right==NULL)
{
current->right =new node(data);
current->right->parent=current;
}
else
insertNode(current->right,data);
}
return;
}
void tree::preOrderTree() //前序遍歷
{
if(root==NULL)
return;
preOrderTree(root);
}
void tree::preOrderTree(node *current)
{
if(current!=NULL)
{
cout<<current->data<<" ";
preOrderTree(current->left);
preOrderTree(current->right);
}
}
void tree::inOrderTree() //中序遍歷
{
if(root==NULL)
return;
inOrderTree(root);
}
void tree::inOrderTree(node *current)
{
if(current!=NULL)
{
inOrderTree(current->left);
cout<<current->data<<" ";
inOrderTree(current->right);
}
}
void tree::postOrderTree() //後序遍歷
{
if(root==NULL)
return;
postOrderTree(root);
}
void tree::postOrderTree(node *current)
{
if(current!=NULL)
{
postOrderTree(current->left);
postOrderTree(current->right);
cout<<current->data<<" ";
}
}
int main()
{
int num[8]={5,3,7,2,4,6,8,1};
tree t(num,8);
cout<<"前序遍歷: ";
t.preOrderTree();
cout<<endl<<endl;
cout<<"中序遍歷: ";
t.inOrderTree();
cout<<endl<<endl;
cout<<"後序遍歷: ";
t.postOrderTree();
cout<<endl;
return 0;
}
前面爲了安全,程序寫的比較麻煩,遞歸方法都放在private裏,然後通過public裏的接口調用,現在可以直接寫成public的,容易理解。
#include<iostream>
using namespace std;
class node //樹節點定義
{
public:
int data; //元素值
node *left; //左子節點
node *right; //右子節點
public:
// node():data(-1),parent(NULL),left(NULL),right(NULL){};
node(int num):data(num),left(NULL),right(NULL){}; //構造函數,初始化類成員變量
};
class tree //樹定義
{
public:
node *root; //樹的根節點
tree(int num[],int len); //構造函數
void insertNode(node *root,int data); //插入遞歸 按左低右高插入樹的節點
void preOrderTree(node *current); //前序遞歸
void inOrderTree(node *current); //中序遞歸
void postOrderTree(node *current); //後序遞歸
};
tree::tree(int num[],int len) //構造函數
{
root=new node(num[0]);
for(int i=1;i<len;i++)
insertNode(root,num[i]); //調用插入函數
}
void tree::insertNode(node *current,int data) //遞歸插入函數樹節點函數
{
if(data<= current->data)
{
if(current->left==NULL)
current->left =new node(data);
else
insertNode(current->left,data);
}
else
{
if(current->right==NULL)
current->right =new node(data);
else
insertNode(current->right,data);
}
}
void tree::preOrderTree(node *current) //前序遍歷
{
if(current!=NULL)
{
cout<<current->data<<" ";
preOrderTree(current->left);
preOrderTree(current->right);
}
}
void tree::inOrderTree(node *current) //中序遍歷
{
if(current!=NULL)
{
inOrderTree(current->left);
cout<<current->data<<" ";
inOrderTree(current->right);
}
}
void tree::postOrderTree(node *current) //後序遍歷
{
if(current!=NULL)
{
postOrderTree(current->left);
postOrderTree(current->right);
cout<<current->data<<" ";
}
}
int main()
{
int num[8]={5,3,7,2,4,6,8,1};
tree t(num,8);
cout<<"前序遍歷: ";
t.preOrderTree(t.root);
cout<<endl<<endl;
cout<<"中序遍歷: ";
t.inOrderTree(t.root);
cout<<endl<<endl;
cout<<"後序遍歷: ";
t.postOrderTree(t.root);
cout<<endl;
return 0;
}