题目:
先序遍历:abdce —> a bd ce
中序遍历:dbaec —> db a ec
可看出 根结点为a,左子是bd,右子就是ce
先序 bd
中序 bd
二叉树中,位置是b为父,d为右子。
先序 ce
中序 ec
位置是 e为左子,c为右子。
Node* build(char pre_str[] , char in_str[] , int len) //前序建立二叉树
{
//根据输入的先序遍历和中序遍历的结果,创建链表树
Node *p = init(pre_str[0]);//将先序遍历的第一个字符存于树根,
int pos = strchr(in_str , pre_str[0]) - in_str;//找到树根第一次在中序遍历中出现的位置
//返回第一处在in_str中出现的 pre_str[0]的位置
if (pos > 0) {
p->lchild = build(pre_str + 1 , in_str , pos);
}
if (pos < len - 1) {
p->rchild = build(pre_str + pos + 1 , in_str + pos + 1 , len - pos - 1);
}
return p;
}
树的代码总结
//构造完全二叉树的顺序存储结构
//按照层数从左到右存储,空元素存符号
#define maxsize 1000
typedef char sqtree[maxsize]//属的元素类型为datatype
void CreatBtree(sqtree bt)
{
int i=1;
char ch;
ch=getchar();
while(ch!='#')
{
bt[i]=ch;i++;ch=getchat();
}
bt[i]='#';
}
//链式存储结构
typedef char datatype;
typedef struct Bnode
{
char data;
struct Bnode*Lchild,*Rchild;
}Btnode,*BTptr;//结点,结点指针
CreateLBtree(BTptr BT)//画出了树的图像,(已知左孩子右孩子)
{
datatype ch;//树结点的值
int i=0;
BTptr p,q;//结点指针
Clearqueue(Q);//清空队列
BT=NULL;//结点初始化
ch=getchar();
while(ch!='#')//输入#作为结束树的标志
{
p =NULL;
if(ch!='@')//如果不等于虚结点 建立新结点,链入到父节点下
//虚结点就是相对完全二叉树来说本该有的孩子却为空,这时i++并且NULL入队 不做链接
//走流程p=NULL,不入本if,i++,NULL入队,i!=1进入else p为空不链接。
//使用队列技术确保正确链入
{
p=(BTptr)malloc(sizeof(Btnode));//申请新结点
p->data=ch;//存入数据
p->Lchild=p->Rchild=NULL;//先初始化为空节点
}
i++;//序号计数
Enqueue(Q,p);//队列Q存在且不满 将p元素插入队尾成为新元素
//新结点地址入队 或者虚结点地址NULL入队
if(i==1) //有效节点从1开始
{
BT=p;//第一输入节点为根
}
else //不是第一个
{
q=Getqtop(Q);
if(p&&q)//p和q都不为空
{
if(i%2==0)//偶数为左孩子
q->Lchild=p;
else//奇数为右孩子 从1开始算
q->Rchild=p;
}
if(i%2==1)
Delqueue(Q);//两个孩子都找到了 出队。 Q->top++;
}
ch=getchar();
}
return (BT);
}
//二叉树递归遍历
/*将层次结构线性化,得到类似线性表的序列
对节点p的访问 需要根据结点的datatype(数据类型)访问:
链表L->data 数组L[i] 队列Q->data[Q->top] 栈S->data[s->top]
记得输出!
记为visit(p) 是函数 根据数据类型和题目需要 补全
*/
//1.前序遍历:
void preorder(BTptr T)//根节点指针为T
{
if(T)
{
visit(T); //前 就是递归的结束标志
preorder(T->Lchild);//左
preorder(T->Rchile);//右
}
}
//中序遍历
void inorder(BTptr T)
{
if(T)
{
inorder(T->Lchild); //左
visit(T); //前
inorder(T->Rchile); //右
}
}
//后序
void postorder(BTptr T)
{
if(T)
{
postorder(T->Lchild);
postorder(T->Rchild);
visit(T);
}
}
//前序建立二叉树
BTptr creat()
{
bitree *t;
char ch;
ch=getchar();
if(ch==' ')
t=NULL;
else
{
t=(BTptr*)malloc(sizeof(Btnode));
t->data = ch;
t->lchild=creat();
t->rchile=creat();
}
return t;
}
//求二叉树的高度
int depth(BTptr *t)
{
int dep1,dep2;//递归 左孩子高度和右孩子高度
if(t==NULL) //已经遍历完了
{
return 1; //深度加一
}
else
{
dep1=t->lchild();
dep2=t->rchild();
if(dep1>dep2) return dep1+1; //记得加一,还得算上自己
else return dep2+1;
}
}
//二叉树镜像
//即交换所有结点的左右子树
void change(BTptr t) //传入参数 头指针
{
Btnode temp;
if(t)
{
temp=t->lchild;
t->lchild=t->rchild;
t->rchiled=temp; //自己的左子右子完成了交换
change(t->rchild);
change(t->lchild);
}
}
//统计叶子节点数目 左孩子结点加右孩子节点,直到左右孩子都为空返回1;
int leaf(Btptr t)
{
if(t->rchild==NULL&&t->lchild==NULL)
return 1;
else
return leaf(t->rchild)+leaf(t->lchild);
}
//复制二叉树 复制结点的数值,左孩子,右孩子。直到 左右孩子都为空返回该节点指针
//本质是 创建新的树s 需要申请新的空间
Btptr copy(btptr t) //t是当前需要复制的结点指针
{
btptr s;//创建新节点
s=(btptr)malloc(sizeof(btnode));
if(t!=NULL)
{
s->data=t->data;
if(t->lchild!=NULL)
{
s->lchild=copy(t->lchild);
}
else
s->lchild=NULL;
if(t->rchild!=NULL)
{
s->rchild=copy(t->rchild);
}
else
s->rchild=NULL;
}
return s;
}
代码片