这几天在看数据结构的二叉树,被二叉树建立时的输入问题困扰很久。二叉树的建立一般使用递归算法,将所有节点的数据一股脑的输入,递归无法停止,二叉树就无法建立。
感谢此博文,原来我们在输入节点数据的时候,必须输入空闲叶子节点,并用特殊符号标记,比如上述的博文的空闲叶子节点采用‘0’作为标记符,就能完整建立二叉树。
修改后的代码,亲测有效:
#include<iostream>
#include<stdio.h>
using namespace std;
struct node
{
char data;
node *left;
node *right;
node(){left=NULL;right=NULL;};
};
node *input()
{
node *p;
char c;
scanf("%c",&c);
if(c=='#')
p=NULL;
else
{
p=new node;
p->data=c;
p->left=input();
p->right=input();
}
return p;
}
void pre(node *root)
{
if(root)
{
char c;
c=root->data;
printf("%c",c);
pre(root->left);
pre(root->right);
}
}
void in(node *root)
{
if(root)
{
char c;
c=root->data;
in(root->left);
printf("%c",c);
in(root->right);
}
}
void post(node *root)
{
if(root)
{
char c;
c=root->data;
post(root->left);
post(root->right);
printf("%c",c);
}
}
int nodenum(node *root)
{
if(root==NULL)
{
return 0;
}
else
{
return 1+nodenum(root->left)+nodenum(root->right);
}
}
int leafnum(node *root)
{
if(root==NULL)
{
return 0;
}
else if((root->left==NULL)&&(root->right==NULL))
{
return 1;
}
else
{
return leafnum(root->left)+leafnum(root->right);
}
}
int deep(node *root)
{
if(root==NULL)
{
return 0;
}
else
{
return deep(root->left)>deep(root->right)?1+deep(root->left):1+deep(root->right);
}
}
int main()
{
node *p;
p=new node;
p=input();
cout<<"先序遍历"<<endl;
pre(p);
printf("\n");
cout<<"中序遍历"<<endl;
in(p);
printf("\n");
cout<<"后序遍历"<<endl;
post(p);
printf("\n");
cout<<"节点数"<<nodenum(p)<<endl;
cout<<"叶子数"<<leafnum(p)<<endl;
cout<<"深度"<<deep(p)<<endl;
return 0;
}