二叉树
csdner1998
这个作者很懒,什么都没留下…
展开
-
lesson19-3 以孩子兄弟链表为存储结构,请设计递归和非递归算法求树的深度
思路:firstchild对应lchildnextsibling对应rchild其他操作和普通二叉树的操作一样代码:int getHeight(BTNode *t){//递归算法 if(!t) return 0; int hc=getHeight(t->firstchild); int hs=getHeight(t->nextsibling); return (hc+1)>hs?hc+1:hs;}int getHeight_(BTNode *t){/原创 2020-08-23 19:49:02 · 933 阅读 · 0 评论 -
lesson18-3 计算二叉树的WPL。
思路:递归思想,先序遍历框架。代码:int WPL=0;int preOrder(BTNode *root,int level){//先序遍历框架 if(root){ if(root->left==NULL&&root->right==NULL)//如果是叶结点,累计WPL WPL+=level*root->weight; if(root->left!=NULL) preOrder(root->left,level+1);原创 2020-08-21 22:16:05 · 697 阅读 · 0 评论 -
lesson17-3 合并二叉树
题目描述:给定两个二叉树,想象当将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。思路1:将两棵树合并到第一棵树上,破坏原来的树。代码1://先序模板BTNode* mergeBitree(BTNode *t1,BTNode *t2){ if(t1==NULL) return t2; if(t2==NULL)原创 2020-08-21 19:17:05 · 122 阅读 · 0 评论 -
lesson16-3 给定一个二叉树,计算整个树的坡度。 一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。 整个树的坡度就是其所有节点的坡度之和
题目描述:给定一个二叉树,计算整个树的坡度。一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。整个树的坡度就是其所有节点的坡度之和。思路:求结点和左右子树的累和值,后续遍历框架,顺便求出坡度代码:int getIncline(BTNode *t){ if(!t) return 0; int sum=0; calcTilt(t,&sum); return sum;}int calcTilt(BTNode *t,原创 2020-08-16 18:06:39 · 243 阅读 · 0 评论 -
lesson15-3 给定一棵二叉搜索树,请找出其中第k大的结点。
思路:用RTL(右子树→根结点→左子树)的遍历方法,得到一个递减有序的序列,第K-1个数据元素即为第k大的结点。或者用中序遍历,得到一个递增序列,输出第 length-k+1 个数据元素即为第k大的结点。代码:int arr[MAXSIZE]={};//全局变量,创建数组接收递减序列int length=0;int searchKthNode(BTNode *t,int k){ traversal(t); return arr[--k];}void traversal(BT原创 2020-08-14 18:55:41 · 217 阅读 · 0 评论 -
lesson 14-3 二叉树用二叉链表存储,设计一个算法,判断两棵二叉树结构是否相同
思路:结构相同就是左右子树结构都相同,不用考虑数据元素内容是否相同三种情况:(1)两棵树都空,返回真(2)一棵空,一棵不空,假(3)如果两棵树都非空,递归判断左右子树结构是否相同代码:bool isSameStructrue(BTNode *t,BTNode *p){ if(t==NULL&&p==NULL)//两棵树都空,结构相同,返回true return true; else if(t==NULL||p==NULL)//一棵树空,一棵树不空,结构原创 2020-08-09 20:09:28 · 4733 阅读 · 0 评论 -
lesson13-3 二叉树采用二叉链表的存储结构,设计一个算法可以求出给定值x的结点层号
代码1:void getLevel(BTNode *t,int level,char x,int *p)//用level记录当前访问层数,用p记录结点所在层数;{ if(t) { level++; if(t->data==x) { *p=level; } getLevel(t->lchild,level,x,p); getLevel(t->rchi原创 2020-08-07 22:59:25 · 2705 阅读 · 2 评论 -
lesson12-3 二叉树用二叉链表存储,设计一个算法,可以求出一颗二叉树的叶子结点数
思路1:直接遍历这棵二叉树,求叶子结点数代码1:int n=0;int count(BTNode *t){ //int n=0; if(t){ if(t->lchild==NULL&&t->rchild==NULL) ++n; count(t->lchild); count(t->rchild); } return n;}思路2:先求左子树叶子结点数,再求右子树叶子结点数,返回二者之和代码2:int c..原创 2020-08-07 22:44:52 · 3024 阅读 · 0 评论 -
lesson11-3 用二叉链表存储结构表示一颗二叉树,设计一个算法,求二叉树的高度
思路1:非递归,用层次遍历算法求二叉树的高度关键:1、last指针何时指向下一层代码1:int getBiTreeDepth(BTNode *t){ //1.创建队列 2.初始化工作=>根节点入队 BTNode *que[MAXSIZE]; int front=-1,rear=-1;//front和rear指针必须是负1,否则front和last永远都不能相遇 int level=0,last=0;//last指针始终指向当前层的最右结点 rear=(rear+1)原创 2020-08-07 22:46:30 · 1920 阅读 · 0 评论 -
lesson8-3 用二叉链表存储二叉树,编写递归算法,将二叉树的所有结点左右子树互换
思想:1、先写递归交换函数2、再写一个交换两个树结点的函数函数:void swap(BTNode *t){ if(!t) return; swap(t->lchild); swap(t->rchild); swapNode(t->lchild,t->rchild);}//交换两个树结点//只要是交换的题,就套用这个函数void swapNode(BTNode *&p,BTNode *&q){ BTNode *temp;.原创 2020-08-07 22:48:19 · 4397 阅读 · 0 评论 -
lesson9-3 给你一个数组,创建二叉树
题干:二叉链表存储结构如下:typedef struct BiNode{ ElemType data; struct BiNode *lchild,*rchild;}BiNode,*BiTree;算法声明如下,请用递归思想完成该算法BiTree create(ElemType A[],int i){ ....}思想:正常创建即可函数:BiTree creat...原创 2020-08-07 22:49:16 · 160 阅读 · 0 评论