二叉树顺序存储的数组遍历,递归遍历
#include <iostream>
#include <cstring>
using namespace std;
class BiTree
{
public:
BiTree();
~BiTree();
int preorder(int n);
int inorder(int n);
int postorder(int n);
int create_BT();
int visit(int n);
int calculate_node(int i,int &n);
int depth(int n);
int max(int a,int b);
int Tree[100];
};
BiTree::BiTree()
{
memset(Tree,0,sizeof(Tree));
}
BiTree::~BiTree()
{
}
//二叉树的建立(顺序存储)
int BiTree::create_BT()
{
int n,i=1;
cout<<"请按照从上到下的顺序依次输入二叉树各个节点,空节点用0表示,以-1表示输入结束:"<<endl;
while(cin>>n&&n!=-1)
{
Tree[i]=n;
i++;
}
return 0;
}
//访问结点
int BiTree::visit(int n)
{
if(Tree[n]!=-1&&Tree[n]!=0)
cout<<Tree[n]<<" ";
return 0;
}
//先序遍历
int BiTree::preorder(int n)
{
if(Tree[n]!=-1&&Tree[n]!=0)
{
visit(n);
preorder(2*n);
preorder(2*n+1);
}
return 0;
}
//中序遍历
int BiTree::inorder(int n)
{
if(Tree[n]!=-1&&Tree[n]!=0)
{
inorder(2*n);
visit(n);
inorder(2*n+1);
}
return 0;
}
//后序遍历
int BiTree::postorder(int n)
{
if(Tree[n]!=-1&&Tree[n]!=0)
{
postorder(2*n);
postorder(2*n+1);
visit(n);
}
return 0;
}
//计算二叉树的结点数(先序遍历法)
int BiTree::calculate_node(int i,int &n)
{
if(Tree[i]!=-1&&Tree[i]!=0)
{
n++;
calculate_node(2*i,n);
calculate_node(2*i+1,n);
}
return 0;
}
//求二叉树的深度
int BiTree::depth(int n)
{
if(Tree[n]!=-1&&Tree[n]!=0)
{
return max(depth(2*n),depth(2*n+1))+1;
}
}
//取较大值
int BiTree::max(int a,int b)
{
return a>b?a:b;
}
int main()
{
BiTree obj1;
int n=0;
obj1.create_BT();
cout<<"二叉树的先序遍历:";
obj1.preorder(1);
cout<<endl;
cout<<"二叉树的中序遍历:";
obj1.inorder(1);
cout<<endl;
cout<<"二叉树的后序遍历:";
obj1.postorder(1);
cout<<endl;
obj1.calculate_node(1,n);
cout<<"结点数为:"<<n<<endl;
n=obj1.depth(1);
cout<<"深度为:"<<n<<endl;
return 0;
}