// 二叉树的基本运算.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
using namespace std;
struct node
{
char data;
node *lChild;
node *rChild;
};
void PreTree(node *b)//先序遍历
{
if(b == NULL)
{
return;
}
else
{
cout<<b->data;
PreTree(b->lChild);
PreTree(b->rChild);
}
}
void InTree(node *b)//中序排序
{
if(b != NULL)
{
InTree(b->lChild);
cout<<b->data;
InTree(b->rChild);
}
}
void BackTree(node* b)//后序排序
{
if(b != NULL)
{
BackTree(b->lChild);
BackTree(b->rChild);
cout<<b->data;
}
}
node * findNode(node *&b,char data)//查找结点
{
node *p = NULL;
if(b == NULL)
{
return NULL;
}
else if(b->data == data)//
{
return b;
}
else
{
p = findNode(b->lChild,data);
if( p!= NULL)
{
return p;
}
else return findNode(b->rChild,data);
}
}
void CreateTree(node *&b,char *str)//创建二叉树
{
//if(b == NULL)cout<<"根结点为空"<<endl;
//cout<<str<<endl;
node *Tree[50];//通过数组栈,实现一层一层的存储(即左右子树的存储)
node *p = NULL;
int top = -1;
int k = 1; //k=1时为左子树,k=2时为右子树
int j = 0;//用来保存提取字符的下标
char ch = str[j];
while(ch != '\0')
{
switch (ch)
{
case '(':
top++;Tree[top] = p; k = 1;break;//进栈,下一个为左孩子结点
case ')'://出栈,之前的那个结点为右孩子
top--;break;
case ','://下个结点是右孩子
k = 2;break;
default://否则是字母
p = new node;
p->lChild = p->rChild = NULL;
p->data = ch;
if(b == NULL)//如果是根结点
{
b = p;
}
else//如果不是根结点
{
if(k == 1)//如果是左子树
{
Tree[top]->lChild = p;
}
else//如果是右子树
{
Tree[top]->rChild = p;
}
}
break;
}
j++;
ch = str[j];//读取下一个字符
}
}
int NodeHeight(node * b)
{
int lChild,rChild;
if(b == NULL)
return 0;
else
{
lChild = NodeHeight(b->lChild);
rChild = NodeHeight(b->rChild);
return (lChild>rChild)?(lChild + 1):(rChild + 1);
}
}
void display(node *&b)//输出二叉树
{
if(b != NULL)
{
cout<<b->data;
if(b->lChild != NULL || b->rChild != NULL)
{
cout<<"(";
display(b->lChild);
if(b->rChild != NULL)cout<<",";
//cout<<",";
display(b->rChild);
cout<<")";
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
node *b = NULL;
CreateTree(b,"A(B(D(G)),C(E,F))");
display(b);
cout<<endl;
//node *p = findNode(b,'C');
//if( p!= NULL)cout<<"已找到了值"<<p->data<<endl;
//else cout<<"没有找到该值"<<endl;
cout<<"高度为:"<<NodeHeight(b)<<endl;
cout<<"先序遍历如下:"<<endl;
PreTree(b);
cout<<endl<<"中序遍历如下;"<<endl;
InTree(b);
cout<<endl<<"后序遍历如下:"<<endl;
BackTree(b);
return 0;
}