其实二叉树的基本操作很多, 但基本上都是基于二叉树的遍历的, 大同小异, 因此我我在这选几种写一下, 至于二叉树的遍历, 我在下一篇专门写;而且在树这一章节对递归要求较高,要对2,3,4多思考一下……
1:创建二叉树 2:查找节点 3:求树的深度 4;用括号表示法输出二叉树
#include<iostream>
using namespace std;
#define MAX(a, b) a>b?a:b;
typedef struct Node
{
char data;
Node *left;
Node *right;
}BTNode;
Node *stack[100];
//由二叉树的括号表示, 创建二叉树,并返回根节点的指针
void CreateBTree( BTNode *&root, char str[])//参数:传入根节点的指针,二叉树的括号表示
{
int j=0, flag=0, top=-1;
BTNode *p=NULL;
while( str[j]!='\0')
{
switch( str[j] )
{
case '(':flag=1;top++;stack[top]=p;break;//若遇到左括号,则把前面刚刚创建的那个节点入栈
case ',':flag=2;break;//若遇到逗号,说明其后创建的节点为右孩子节点, flag=2
case ')':top--;break;//若遇到右括号,说明栈顶结点的左右孩子处理完毕, 栈顶结点出栈
default://遇到元素
p=new Node;//创建新节点
p->data=str[j]; p->left=p->right=NULL;//为新建节点赋值:且此时栈顶结点是p的父节点
if( root==NULL ) //如果根节点为空
{
root=p;
}
else
{
switch( flag )
{
case 1:stack[top]->left=p;break;//flag=1说明p为栈顶元素左儿子
case 2:stack[top]->right=p;break;//p为栈顶元素右儿子
}
}
}
j++;
}
}
//!!查找二叉树中值为ch的节点, 如果找到,返回其指针,否则返回NULL
BTNode *FindNode(BTNode *root, char ch) //参数:传入根节点,要查找的值
{
BTNode *p=NULL;
if( root==NULL ) return NULL;
if( root->data==ch ) return p;
p=FindNode(root->left, ch);//查找左子树
if( p!=NULL ) return p;//如果已找到节点, 返回结点的指针
else return FindNode(root->right, ch);//否则, 查找右子树
}
//从0开始,得到树的深度
int BTreeHeight( BTNode *p)
{
if( p==NULL ) return 0;
//获得p的左子树,右子树的深度(都不含p),然后分别加1,表示从p开始,到左子树末端的深度,和到右子树末端的深度;二者取最大值
return MAX(BTreeHeight(p->left)+1,BTreeHeight(p->right )+1);
}
//以括号表示输出二叉树
void DispBTree(BTNode *p)//自己写的
{
if( p!=NULL ) cout<<p->data;//当p节点非空时输出节点的值
else return;//否则,结束
if( p->left!=NULL )//遍历左子树
{
cout<<"(";//当p左儿子非空时,输出左括号
DispBTree( p->left );
}
if( p->right!=NULL)//遍历右子树
{
cout<<",";//当p右儿子非空时,输出逗号
DispBTree( p->right );
cout<<")";//
}
}
void PreOrder( Node *p )//先序遍历
{
if( p!=NULL )
{
cout<<p->data<<" ";
PreOrder( p->left );
PreOrder( p->right );
}
}
int main()
{
Node *root=NULL;
char str[100];
cout<<"请输入二叉树的括号表示:"<<endl;
cin>>str;
CreateBTree(root, str);
cout<<"二叉树深度为:"<<endl;
cout<<BTreeHeight( root )<<endl;
cout<<"输出二叉树:"<<endl;
DispBTree( root );
cout<<endl;
PreOrder( root );
cout<<endl;
}