百度的笔试有关于二叉树的遍历,当时总想着我怎么可能做出来,后来在仔细想下其实很简单
二叉树的数据结构:
typedef struct node{
int data;
struct node * lchild;
struct node * rchild;
}BiTNode,*BiTree;
1、二叉树的创建过程无非就是一个递归创建的过程,最后返回的是根结点的指针
先序的方式在创建
Bitree Create(BiTree T){
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
if(T==NULL)
printf("Error!");
T->data=ch;
T->lchild=Create(T->lchild);
T->rchild=Create(T->rchild);
}
return T;
}
遍历
void Preorder(BiTree T){
if(T==NULL)
return ;
putchar(T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
求二叉树的深度
也是分治 (把大的问题分解成小的问题)递归的思想
int depth(BiTree T){
int dep=0,depl,depr;
if(!T)
dep=0;
else{
depl=depth(T->lchild);
depr=depth(T->rchild);
dep=1+(depl>depr?depl:depr);
}
return dep;
}
求叶子结点
int sumdef(BiTree T){
int sum=0,rdeaf=0,ldeaf=0;
if(T==NULL)
return 0;
if(T->lchild==NULL&&T->rchild==NULL)
sum++;
rdeaf=sumdef(T->lchild);
ldeaf=sumdef(T->rchild);
sum=sum+rdeaf+ldeaf;
return sum;
}
分层遍历二叉树
先了解下C++中队列的相关知识:
queue模板类也要两个参数,元素类型和容器类型
1.入队:push(x)
2.出队: pop()不会返回被弹出元素的值
3.访问队首元素,如例:q.front(),即最早被压入队列的元素。
4.访问队尾元素,如例:q.back(),即最后被压入队列的元素。
5.判断队列空,如例:q.empty(),当队列空时,返回true。
6.访问队列中的元素个数,如例:q.size()
void cengci(BiTree T){
queue<BiTree> q;//创建存放结点指针的队列
if(T){
q.push(T);
while(!q.empty()){
BiTree node=q.front();
q.pop();
printf("%d",node->data);
if(node->lchild!=NULL)
q.push(node->lchild);
if(node->rchild!=NULL)
q.push(node->rchild);
}
}
}
将二叉查找树变为有序的双向链表
待续。。。
求二叉树第K层的节点个数
1.二叉树为空或者k<1返回0;