这里是anyview的部分题解
DC06PE46
题目描述:
利用队列的基本操作,编写复制一棵又树的非递归算法。
要求实现下列函数:void CopyBiTree(BiTree T, BiTree &TT);
typedef char TElemType;
typedef struct BiTNode {
TElemType data;
BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
非递归算法
#include<iostream>
#include<queue>
BiTNode* func(){
BiTNode * node = (BiTNode*)malloc(sizeof(BiTNode));
if(!node)return NULL;
node->data = 0;
node->lchild = NULL;
node->rchild = NULL;
return node;
}
void CopyBiTree(BiTree T, BiTree &TT)
{
TT = func();
if(T==NULL){
TT = NULL;
return ;
}
std::queue<BiTree> Q1;
std::queue<BiTree> Q2;
Q1.push(T);Q2.push(TT);
BiTree p1=NULL,p2=NULL;
while(!Q1.empty()){//队列不为空
p1 = Q1.front();Q1.pop();
p2 = Q2.front();Q2.pop();
p2->data = p1->data;//节点复制
if(p1->lchild){
Q1.push(p1->lchild);
p2->lchild = func();
Q2.push(p2->lchild);
}
if(p1->rchild){
Q1.push(p1->rchild);
p2->rchild = func();
Q2.push(p2->rchild);
}
}
}
DC06PE58
题目描述:
假设二叉树中结点值互不相同,编写算法: 求二又树中以元素值为x的结点为根的子树的结点总数。
实现下列函数:int xSum(BiTree T, TElemType x);
typedef struct BiTNode {
TElemType data;
struct BiTNode*lchild,*rchild;
}BiTNode,*BiTree;
非递归算法
BiTNode* func(BiTree T,TElemType x){
if(T== NULL)return NULL;
if(T->data == x){
return T;
}
BiTNode * left = func(T->lchild,x);
if(left) return left;
BiTNode *right = func(T->rchild,x);
if(right) return right;
return NULL;
}
int CountNode(BiTree T){
if(T == NULL)return 0;
int left_node = CountNode(T->lchild);
int right_node = CountNode(T->rchild);
return left_node+right_node+1;
}
int xSum(BiTree T, TElemType x)
{
//先找到X节点
BiTree p = func(T,x);
return CountNode(p);
}
DC06PE75
题目描述:
在二叉排序树的每个结点中增设一个lsize域,其值为该结点的左子树中的结点数加1。求树中第k小的结点的位置。
实现函数BSTNode *Ranking(BSTree T, int k);
// 节点定义如下:
typedef char KeyType;
typedef struct BSTNode {
KeyType key;
struct BSTNode *lchild,*rchild;
int lsize;
}BSTNode,*BSTree;
非递归算法
#include<iostream>
#include<stack>
BSTree func(BSTree T,int numkey){
if(T==NULL)return NULL;
std::stack<BSTree> S;
BSTree p;
p = T;
int count = 0;
while(!S.empty()||p!=NULL){
while(p!=NULL){
S.push(p);
p = p->lchild;
}
p = S.top();S.pop();
count++;//访问到了这个节点
if(numkey == count){
return p;
}
else if(p->rchild!=NULL){
p = p->rchild;
}else p = NULL;
}
return NULL;
}
BSTNode *Ranking(BSTree T, int k)
{
// 方法1
if(T == NULL)return NULL;
if(k == T->lsize)return T;
// 如果值在左子树
if(T->lsize>k){
//进行中序遍历
return func(T->lchild,k);
}
if(T->lsize<k){
//进入右子树寻找,进行中序遍历
return func(T->rchild,k-(T->lsize));
}
return NULL;
}
递归算法
BSTNode *Ranking(BSTree T, int k)
{
if(NULL == T)return NULL;
if(T->lsize==k)return T;
else if(k<T->lsize) return Ranking(T->lchild,k);
else return Ranking(T->rchild,k-T->lsize);
}