最近在学树,总结一下……
一:由二叉树的括号表示来构建二叉树
1:非递归形式:
#include<iostream>
using namespace std;
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;
cout<<j<<endl;
}
else
{
switch( flag )
{
case 1:stack[top]->left=p;break;//flag=1说明p为栈顶元素左儿子
case 2:stack[top]->right=p;break;//p为栈顶元素右儿子
}
}
}
j++;
}
}
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;
PreOrder( root );
}