存储实现:
采用二叉链表实现,每个结点有一个数据域、一个指向左孩子的指针、一个指向右孩子的指针。
lchild | root | rchild |
以下是我踩(nao)过(can)的(shun)雷(jian)
1.定义了root(结点),但是没有分配内存空间
2.建议不要在创建二叉树的函数里设置形参,没有必要传来传去。
原因:①浪费空间(每传递一次就要被复制一次)
②逻辑比较绕,可读性差,容易出错
3.中序遍历和后序遍历的时候,复制先序遍历的代码,改了递归调用和输出结点值的顺序,但是忘了改调用函数的函数名,导致后序和中序遍历的结果不对。【复制需谨慎啊】
终于成功了的代码实现:
#include <iostream>
using namespace std;
typedef struct btnode{
char data;
struct btnode *lchild,*rchild;
}btnode,*bitree;
/*先序递归创建二叉树*/
bitree preCreateBitree()
{
char ch ;
// cout<<"请输入:"<<endl;
bitree root; //root为每一个新结点
root=new(btnode); //给每个结点开辟空间
cin>>ch;
if(ch=='#') root=NULL;
else{
root->data=ch;
root->lchild=preCreateBitree();
root->rchild=preCreateBitree();
}
return root;
}
/*先序遍历*/
void fSearch(bitree root)
{
if(root)
{
cout<<root->data;
fSearch(root->lchild);
fSearch(root->rchild);
}
return ;
}
/*中序遍历*/
void mSearch(bitree root)
{
if(root)
{
mSearch(root->lchild);
cout<<root->data;
mSearch(root->rchild);
}
return ;
}
/*后序遍历*/
void lSearch(bitree root)
{
if(root)
{
lSearch(root->lchild);
lSearch(root->rchild);
cout<<root->data;
}
return ;
}
//主函数
int main()
{
bitree root;
root=preCreateBitree();
cout<<"先序遍历:"<<endl;
fSearch(root);
cout<<endl<<"中序遍历:"<<endl;
mSearch(root);
cout<<endl<<"后序遍历:"<<endl;
lSearch(root);
return 0;
}