把例程敲一遍 才对二叉树有了个基本的认识
完整正确例程:
- #include <iostream>
- #include<stdlib.h>
- using namespace std;
- //二叉树出的二叉链表结构定义
- struct bitnode
- {
- char data;
- bitnode *lchild,*rchild;
- };
- bitnode *t;
- //bitree==*bitnode
- //前序遍历递归
- void preordertraverse(bitnode *t)
- {
- if(t==NULL)
- return ;
- cout<<t->data;
- preordertraverse(t->lchild);
- preordertraverse(t->rchild);
- }
- //二叉树的中序遍历递归
- void inordertraverse(bitnode *t)
- {
- if(t==NULL)
- return ;
- inordertraverse(t->lchild);
- cout<<t->data;
- inordertraverse(t->rchild);
- }
- //二叉树后序遍历递归
- void postordertraverse(bitnode *t)
- {
- if(t==NULL)
- return ;
- postordertraverse(t->lchild);
- postordertraverse(t->rchild);
- cout<<t->data;
- }
- //按前序输入二叉树中结点的值(一个字符)
- //#表示空树,构造二叉链表表示二叉树t《大话数据结构》
- void createbitree(bitnode *(*t))
- {
- char ch;
- cin>>ch;
- if(ch=='#')
- (*t)=NULL;
- else
- {
- (*t)=new bitnode;
- //if(!t)
- // exit(0);
- (*t)->data=ch;
- createbitree(&(*t)->lchild);//构造左子树
- createbitree(&(*t)->rchild);//构造右子树
- }
- }
- int main()
- {
- cout<<"请输入全部结点(空指针用#代替):"<<endl;
- createbitree(&t);
- cout<<"\n\n先序遍历"<<endl;
- inordertraverse(t);
- cout<<"\n中序遍历"<<endl;
- preordertraverse(t);
- cout<<"\n后序遍历"<<endl;
- postordertraverse(t);
- cout<<endl;
- return 0;
- }
下面是运行结果:
错误的建树函数:
错误原因是:参数有单向传递的特点,修改后的data无法传递到主函数中
- void createbitree(bitnode *t)
- {
- char ch;
- cin>>ch;
- if(ch=='#')
- t=NULL;
- else
- {
- t=new bitnode;
- //if(!t)
- // exit(0);
- t->data=ch;
- createbitree(t->lchild);//构造左子树
- createbitree(t->rchild);//构造右子树
- }
- }*/
修改指针的值:二级指针,引用,返回值(返回修改后的指针)
- 1传引用/
- /*在主函数中定义树,然后传到createbitree中
- void createbitree(bitnode &t)
- {
- char ch;
- cin>>ch;
- if(ch=='#')
- t=NULL;
- else
- {
- t=new bitnode;
- //if(!t)
- // exit(0);
- t->data=ch;
- createbitree(t->lchild);//构造左子树
- createbitree(t->rchild);//构造右子树
- }
- }
- main函数中改为:createbitree(t);
- 2 //返回值:
- /*直接在函数中定义树;
- bitnode * createbitree()
- {
- bitnode *t;
- char ch;
- cin>>ch;
- if(ch=='#')
- t=NULL;
- else
- {
- t=new bitnode;
- //if(!t)
- // exit(0);
- t->data=ch;
- createbitree(t->lchild);//构造左子树
- createbitree(t->rchild);//构造右子树
- }
- return t;
- }
- 主函数:createbitree();
- */
- //按前序输入二叉树中结点的值(一个字符)
- //#表示空树,构造二叉链表表示二叉树t《大话数据结构》
- void createbitree(bitnode *(*t))
- {
- char ch;
- cin>>ch;
- if(ch=='#')
- (*t)=NULL;
- else
- {
- (*t)=new bitnode;
- //if(!t)
- // exit(0);
- (*t)->data=ch;
- createbitree(&(*t)->lchild);//构造左子树
- createbitree(&(*t)->rchild);//构造右子树
- }
- }