中序遍历对二叉树线索化的递归算法

void InThread(ThreadTree &P,ThreadTree &pre)
{if(p!=null){InThread(p->lchild,pre);if(lchild==null){p->lchild=pre;p->ltag=1;}if(pre!=null&&pre->rchild==null){pre->rchild=p;pre->rtag=1;}pre=p;InThread(p->rchild,pre);}
}void CreatInTread(ThreadTree T)
{ThreadTree pre=null;if(T!=null){InThread(T,pre);pre->rchild=null;pre->rtag=1;}
}

已知一棵二叉树按顺序存储结构进行存储,设计一个算法,求编号i到j的两个结点的最近的公共祖先结点的值

ElemType Comm_Ancestor(SqTree T,int i,int j)
{if(T[i]!='#'&&T[j]!='#'){while(i!=j){if(i>j)i=i/2;elsej=j/2;}return T[i];}
}

假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树高度

int Btdepth(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;}
}

二叉树按二叉链表形式存储,写一个判别给定二叉树是否是完全二叉树的算法

解题思想:
根据完全二叉树的定义,具有n个结点的完全二叉树与满二叉树中编号1–n的结点一一对应。
采用层次遍历的算法,将所有结点加入队列(包括空结点),当遇到空结点时,查看其后是否有非空结点,若有,则二叉树不是完全二叉树。

bool IsComplete(BiTree &T)
{InitQueue(Q);if(!T)                        空树为满二叉树return 1;EnQueue(Q,T);while(!IsEmpty(Q)){DeQueue(Q,p);if(p)                      结点非空,将其左右树入队列{EnQueue(Q,p->lchild);EnQueue(Q,p->rchild);}else                       结点为空,检查其后是否有非空结点{while(!IsEmpty(Q)){DeQueue(Q,p);if(p)              结点为空,检查其后是否有非空结点return 0;}}return 1;}
}

假设二叉树采用二叉链表存储结构存储,试设计一个算法,计算给定二叉树的所有双分支结点个数

int DsonNodes(BiTree &T)
{if(T==null)return 0;else if(T->lchild!=null&&T->rchild!=null)return DsonNodes(T->lchild)+DsonNodes(T->rchild)+1;elsereturn DsonNodes(T->lchild)+DsonNodes(T->rchild);
}

假设二叉树采用二叉链表存储结构,设计一个算法,求先序遍历序列中第k个结点的值(1≤k≤二叉树中结点个数)

解题思路:
设置一个全局变量i记录已访问过的结点序号,其初值是根结点在先序序列中的序号,即为1,。
当二叉树为空时返回特殊字符‘#’。
当i=k时,小时豪到满足条件的结点。返回b->data;
当i!=k时,则递归地在左子树中查找,若找到了则返回该值,否则继续递归地在右子树中查找,并返回其结果

int i=1;
ElemType PreNode(BiTree b,int k)
{if(b==null)return '#';if(i==k)return b->data;ch=PreNode(b->lchild,k);if(ch!='#')return ch;ch=PreNode(b->rchild,k);return ch;
}

在二叉树中查找值为x的结点,试编写算法,打印值为x的结点的所有祖先,假设值为x的结点不多于1个

算法思想:采用非递归后序遍历,最后访问根节点,当访问之为x的结点时,栈中所有元素均为该结点的祖先,依次出栈打印即可

typedef struct
{BiTree t;int tag;
}stack          tag=0表示左子树被访问,tag=1时表示右子女被访问void search(BiTree bt,ElemType x)
{stack s[];top=0;while(bt!=null||top>0){while(bt!=null&&bt->data!=x){s[++top].t=bt;s[top].tag=0;bt=bt->lchild;}if(bt->data==x){printf("所查结点的所有祖先结点的值为:");for(int i=1;i<=top;i++)printf("%d",s[i].t->data);exit(0);}while(top!=0&&s[top].tag==1)top--;if(top!=0){s[top].tag=1;bt=s[top].t->rchild;}}
}

若一棵二叉树的结点结构为(LLIKE,INFO,RLINK),ROOT指向该二叉树根结点的指针,p和q分别指向该二叉树中任意两个结点,试比阿尼额算法,ANCESTOR(ROOT,p,q,r),该算法找到p和q的最近公共祖先结点

算法思想:
采用后续非递归遍历算法,栈中存放二叉树结点的指针,当访问到某结点时,栈中所有元素均为该结点的祖先,后续遍历必然先遍历到结点p,栈中元素均为p的忑结点,先将栈复制到另一块辅助栈中去,继续遍历到结点q时,将栈中元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配到的元素即结点p与q的公共最近祖先。

typedef struct
{BiTree t;int tag;    tag=0左子女被访问过,tag=1时,右子女被访问过
}srack;stack s1[],s2[];
BiTree Ancestor(BiTree ROOT,BiTNode *p,BiTNode *q)
{top=0;bt=ROOT;while(bt!=null&&bt!=p&&bt!=q){while(bt!=null){s[++top].t=bt;s[top].tag=0;bt=bt->lchild;}while(top!=0&&s[top].tag==1){if(s[top].t==p){for(i=1;i<=top;i++){s1[i]=s[i];top1=top;}if(s[top].t==q){for(i=top;i>0;i--)for(j=top1;j>0;j--)if(s1[j].t==s[i].t)return s[i].t;}top--;}if(top!=0){s[top].tag=1;bt=s[top].t->rchild;}}}
}

假定二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树b的宽度(即具有结点数最多的那一层的结点个数)

采用层次遍历,求出所有结点的层次,并将所有结点与对应的层次放在一个队列中,然后通过扫描队列求出各层的结点总数即二叉树的宽度

typedef struct
{BiTree data[MaxSize];        结点int level[MaxSize];          保存data中相同下表的结点层int front,rear;
}Qu;int BTWidth(BiTree b)
{BiTree p;int i,k,max,n;Qu.front=Qu.rear=-1;Qu.rear++;Qu.data[Qu.rear]=b;Qu.level[Qu.rear]=1;while(QU.front<Qu.front){Qu.rear++;p=Qu.data[Qu.front];k=Qu.data[Qu.front];if(p->lchild!=null){Qu.rear++;Qu.data[Qu.rear]=p->lchild;Qu.level[Qu.rear]=k+1;}if(p->rchild!=null){Qu.rear++;Qu.data[Qu.rear]=p->rchild;Qu.level[Qu.rear]=k+1;}max=0;i=0;k=1;while(i<=Qu.rear){n=0;while(i<=Qu.rear&&Qu.level[i]==k){i++;n++;}k=Qu.level[i];if(n>max)max=n;}return max;}
}

设计一个算法,将二叉树的叶结点从做导游的顺序连成一个单链表,表头指针为head,二叉树按二叉链表方式存储,链接时用叶结点的右指针域来存放单链表指针

算法思想:
通常我们所使用的先序,中序和后续遍历对于叶结点的访问都从左到右排序,这里我们采用中序遍历递归算法。
设前驱结点指针pre,初始为空,第一个叶结点由指针head指向,遍历到叶结点时,就将它的前驱rchild指向它,最后一个叶结点rchild为空

LinkList head,pre=null;
LinkList InOrder(BiTree bt)
{if(bt){InOrder(br->lchild);if(bt->lchild==null&&bt->rchild==null){if(pre==null){head=bt;pre=bt;}else{pre->rchild=bt;pre=bt;}InOrder(bt->rchild);pre->rchild=null;}return head;}
}

试设计判断两课二叉树是否相似的算法。所谓二叉树T1与T2相似,指的是T1与T2都是空的二叉树或都只有一个根结点;或T1的左子树与T2的左子树是相似的且T1的右子树与T2的右子树是相似的

int similar(BiTree T1,BiTree T2)
{int lefts,rights;if(T1==NULL&&t2==NULL)return 1;else if(T1==NULL||T2==NULL)return 0;else{lefts=similar(T1->lchild,T2->lchild)rights=similar(T1->rchild,T2->rchild);return lefts&&rights;}
}

【考研】东北大学二叉树相关算法(1)相关推荐

  1. 【考研】东北大学二叉树相关算法(2)

    编写一个算法,判断给定的二叉树是否是二叉排序树 keyType predt=-32767; int JudgeBst(BiTree bt) {int b1,b2;if(bt==null)return ...

  2. iOS 二叉树相关算法实现

    什么是二叉树? 在计算机科学中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"和"右子树",左子树和右子树同时也是二叉树.二叉树的子树有左右之 ...

  3. 二叉树相关算法汇总(详细)

    二叉树基本知识 二叉树(Binary Tree)是n(n≥0)个有限元素的集合,该集合或者为空,或者由一个称为根(root)的元素及两个不相交的.被分别称为左子树和右子树的二叉树组成.当集合为空时,称 ...

  4. 编写算法判别给定二叉树是否为完全二叉树_别找了,链表和二叉树相关面试题以及解答,我都给你们找好了...

    来源公众号:苦逼的码农 作者:帅地 无论是在面试还是在平时的做题中,链表相关算法题以及二叉树相关算法题,可以说是考的非常非常多的.我在 2019 的秋招面试中,也是遇到了好几次.为此,我总结了 9 道 ...

  5. svd文章分类 c语言,推荐系统相关算法:SVD

    假如要预测Zero君对一部电影M的评分,而手上只有Zero君对若干部电影的评分和风炎君对若干部电影的评分(包含M的评分).那么能预测出Zero君对M的评分吗?答案显然是能.最简单的方法就是直接将预测分 ...

  6. 东北大学考研二叉树相关试题

    设t为一颗二叉树的根节点地址指针,设计一个非递归的算法把二叉树中每个节点的左右孩子位置交换 void Exchange(BinTreeNode* t){stack<BinTreeNode*> ...

  7. Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现

    Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树.二叉查找树的插入节点.二叉查找树的删除.二叉树的遍历.平衡二叉树)C++语言实现 目录 树的基础知识 1.二叉树的遍-前序 ...

  8. 不再惧怕!二叉树结构相关算法总结 | 原力计划

    作者 | BoCong-Deng 来源 | CSDN 博客,责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 写在前面 树结构对于程序员来说应该不陌生,特别是二叉树,基本只要接触算法这一类 ...

  9. 不再惧怕!二叉树结构相关算法总结

    写在前面 树结构对于程序员来说应该不陌生,特别是二叉树,基本只要接触算法这一类的都一定会碰到的,所以我打算通过一篇文章,对二叉树结构的相关算法进行总结汇总,思路和代码实现相结合,让你不在惧怕二叉树.( ...

最新文章

  1. 2021年春季学期-信号与系统-第七次作业参考答案-第四小题
  2. android79 Fragment生命周期
  3. 技术选型:为什么批处理我们却选择了Flink
  4. oracle嵌套三层循环语句,在存储过程中执行3种oracle循环语句
  5. 秦叶阳(1986-),女,就职于北京大学,安徽荣创智能科技有限公司联合创始人...
  6. 重磅!ICCV 2019 COCO + Mapillary 联合识别挑战赛开启!
  7. Mysql学习总结(27)——Mysql数据库字符串函数
  8. JNDI学习总结(4)——Tomcat下使用Druid配置JNDI数据源
  9. 二、optimizer_trace基本使用
  10. c#设置mysql超时,C#访问SqlServer设置链接超时的方法
  11. Saas平台级架构:统一身份认证管理系统用户权限管理
  12. 从零开始开发一个大型网站
  13. Endnote 导出中英文参考文献到Word
  14. matalb读取txt文件以及将数据写入txt文件
  15. pygame用blit()实现动画效果
  16. Kafka SASL/SCRAM动态认证集群部署
  17. 3ds max 软件主菜单中添加新的菜单
  18. 原生小程序使用二维码扫码调用接口
  19. c语言教学知识,C语言的编程教程_入门教学知识
  20. 华为云计算入门-计算虚拟化

热门文章

  1. 微信小程序自定义弹出框
  2. rapidcsv 写csv文件实例
  3. FL Studio中Plucked!合成器的使用方法
  4. 使用java爬取数据的三种思路
  5. cad下载2010免费中文版的操作和方法
  6. 微信小程序用户隐私数据解密
  7. 【0元试用微软 Azure人工智能认知服务】这个人脸识别功能太强大啦
  8. Selenium原理及安装教程
  9. Selenium原理及元素定位方法(JAVA)
  10. 新媒体销售人要大胆开口