算法笔记–二叉树相应的算法题
1.二叉树自下而上、从右到左的层次遍历算法
void InvertLevel(BiTree T){
Stack s;
Queue q;
if(bt){
InitStack(s);
InitQueue(q);
EnQueue(q,T);
while(!IsEmpty(q)){
DeQueue(q,p);
push(s,p);
if(p->lchild)
EnQueue(q,p->lchild);
if(p->rchild)
EnQueue(q,p->rchild);
}
while(!IsEmpty(s)){
pop(s,p);
visit(p->data);
}
}
}
2.设计非递归算法求链表存储的二叉树高度
int GetHeight(BiTree T){
if(!T) return 0;
int front=-1,rear=-1;
int last=0,level=0;
BiTree q[MaxSize];
q[++rear]=T;
BiTree p;
while(front<rear){
p=q[++front];
if(p->lchild)
q[++rear]=p->lchild;
if(p->rchild)
q[++rear]=p->rchild;
if(front==last){
level++;
last=rear;
}
}
return level;
}
int GetHeight2(BiTree T){
if(!T) return 0;
lheight=GetHeight2(T->lchild);
rheight=GetHeight2(T->rchild);
if(lheight<rheight) return riheight+1;
else lheight+1;
}
3.一颗节点各不相同的二叉树,先序和中序遍历的序列分别存在两个一维数组A[1…n]和B[1…n]中,建立该二叉树链表
BiTree createBiTree(ElemType A[],ElemType B[],int l1,int h1,int l2,int h2){
root=(BiTNode*)malloc(sizeof(BiTNode));
root->data=A[l1];
for(i=l2;B[i]!=root;i++);
llen=i-l2;
rlen=h2-i;
if(llen)
root->lchild=createBiTree(A,B,l1+1,l1+llen,l2,l2+llen-1);
else root->lchild=null;
if(rlen)
root->rchild=createBiTree(A,B,l1+llen,h1,l2+llen,h2);
else root->rchild=null;
return root;
}
4.二叉树按链表存储,判断给定二叉树是否一个完全二叉树
bool CheckCompleteBT(BiTree T){
queue<BitNode> q;
if(!T) return true;
q.push(T);
while(!q.empty()){
auto p=q.front();
q.pop();
if(p){
q.push(p->lchild);
q.push(p->rchild)
}else{
while(!q.empty()){
p=q.front();
q.pop();
if(p) return false;
}
}
}
return true;
}
5.二叉树采用二叉链表存储,计算给定一颗二叉树的所有双分支节点个数
计
算
一
颗
二
叉
树
b
中
所
有
双
分
支
节
点
个
数
的
递
归
模
型
如
下
:
f
(
b
)
=
0
,
b
=
n
u
l
l
f
(
b
)
=
f
(
b
?
>
l
c
h
i
l
d
)
+
f
(
b
?
>
r
c
h
i
l
d
)
+
1
,
b
为
双
分
支
节
点
f
(
b
)
=
f
(
b
?
>
l
c
h
i
l
d
)
+
f
(
b
?
>
r
c
h
i
l
d
)
,
b
为
单
分
之
节
点
o
r
叶
子
节
点
计算一颗二叉树b中所有双分支节点个数的递归模型如下:\\ f(b)=0,b=null\\ f(b)=f(b->lchild)+f(b->rchild)+1,b为双分支节点\\ f(b)=f(b->lchild)+f(b->rchild),b为单分之节点or叶子节点
计算一颗二叉树b中所有双分支节点个数的递归模型如下:f(b)=0,b=nullf(b)=f(b?>lchild)+f(b?>rchild)+1,b为双分支节点f(b)=f(b?>lchild)+f(b?>rchild),b为单分之节点or叶子节点
int computeDNode1(BiTree T){
if(!T) return 0;
else if(T->lchild&&T->rchild)
return computeDNode(T->lchild)+computeDNode(T->rchild)+1;
else
return computeDNode(T->lchild)+computeDNode(T->rchild);
}
int computeDNode2(BiTree T){
queue<BitNode> q;
int num=0;
q.push(T);
while(!q.empty()){
auto p=q.front();
q.pop();
if(p->lcihld&&p->rchild)
num++;
q.push(p->lchild);
q.push(p->rchild);
}
return num;
}
6.若树B是链式存储的二叉树,设计一个把树B中所有节点的左、右子树进行交换的函数
void swap(BiTree T){
if(T){
swap(b->lchild);
swap(b->rchild);
auto temp=T->lchild;
T->lchlid=T->rchild;
T->rchild=temp;
}
}
7.二叉树采用链表存储,求先序遍历序列中第k个节点的值(1<=k<=n)
int i=1;
ElemType getIndex(BiTree T,int k){
if(!T) return null;
if(i==k) return T->data;
i++;
auto val=getIndex(T->lchild,k);
if(val!=null) {
i=1;
return val;
}
val=getiIndex(T->rchild,k);
i=1;
return val;
}
|