前言:
现在我们对“求二叉树宽度算法”都比较关心,兄弟们都想要知道一些“求二叉树宽度算法”的相关内容。那么小编也在网络上搜集了一些有关“求二叉树宽度算法””的相关内容,希望你们能喜欢,小伙伴们一起来了解一下吧!设计一个算法,删除递增有序表中大于mink且小于maxk的所有元素void Delete_Min_Max(LinkList&L,int mink,int maxk){p=L->next; while(p&&p->data<=mink) {pre=p; p=p->next; } while(p&&p->data<maxk) p=p->next; q=pre->next; pre->next=p; while(q!=p) { s=q->next; free(q); q=s; }}已知一个双向循环链表,从第二个结点至表尾递增有序,要求将第一结点插入到链表中,使整个链表递增有序void DInsert(DLinkedList dl)//dl是无头结点的双向循环链表,自第二结点插入到链表{s=la;//暂存第一节点的指针p=la->next;p->prior=la->prior;p->prior->next=p;//将第一结点从链表上摘下来 while(p->data<x)//查插入位置 p=p->next; s-next=p; s->prior=p->prior; p->prior->next=s; p->prior=s;//插入原第一节点}if(p->data<x) p-p->next;else break;} 给定一个链表,判断链表中是否有环,有返回1,没有返回0快慢指针遍历链表,如果有环,指针相遇int hasCycle(ListNode*head){//判断链表中是否有环 if(head==NULL||head->next==NULL)//链表为空,或者只有一个结点一定不会带环 return 0; ListNode*fast=head->next; ListNode*slow=head; while(slow!=fast) {if(fast==NULL||fast->next==NULL) return 0; slow=slow->next; fast=fast->next->next; } return 1;}计算二叉树的最大宽度int width(BiTree T){//求二叉树高度 if(T==NULL) return 0;//空树 else {BiTree Q[MaxSize];//假设队列容量足够大front=rear=-1;//初始化 int last=1;//同层最右结点在队列中的位置int tmp=0;//局部高度int maxw=0;//最大宽度 Q[rear]=T;//根节点入队 BiTree p; while(front<=rear) {p=Q[++front]; tmp++; if(p->lchild!=NULL) Q[++rear]=p->lchild;//左子树入队 if(p->rchild!=NULL) Q[++rear]=p-rchild;//右子树入队 if(front>last) {last=real;//指向下层最右元素 if(tmp>maxw)//更新当前最大宽度 maxw=tmp; tmp=0; } } return maxw; }}假设二叉树采用二叉链存储结构存储,设计一个算法,求后序遍历序列中第K个结点的值int n=1;//全局变量Elem Type PostNode(BTNode* b,int k){Elem Type ch; if(b==NULL) return' '; ch=PostNode(b->lchild,k);//遍历左子树 if(ch!=' ')//在左子树找到了就返回 return ch; else { ch=PostNode(b->rchild,k);//遍历右子树 if(ch!=' ')//在右子树找到就返回 return ch; if(n==k) return b->data; n++; }} 二叉排序树采用二叉链表存储,删除结点值是X的结点,要求删除该结点后,此树仍然是一颗二叉排序树, 并且高度没有增长void Delete(BSTree bst,keytype X){BSTree f,p=bst; while(p&&p->key!=X) if(p->key>x) {f=p;p=p->lchild; } else{f=p; p=p->rchild; if(p==null) {printf("无关键字为X的结点\n"); exit(0); } if(p->lchild==null)//被删结点无左子树 if(f->lchild==p) f->lchild=p->rchild;//将被删结点的右子树接到其双亲上 else//被删结点有左子树 {q=p; s=p->lchild; while(s->rchild!=null)//左子树中最右下的结点 {q=s; s=s->rchild; } p->key=s->key;//结点值用其左子树最右下的结点的值代替 if(q==p)//被删结点左子树的根节点无右子女 p->lchild=s->lchild; else//被删结点左子树中序序列最后一个结点 q->rchild=s->lchild; free(s); } } 写出折半查找非递归算法 int Binary_Search(SqList L,ElemType key) {int low=0,high=L,length-1,mid; while(low<=high) {mid=(low+high)/2;//取中间位置 if(L.elem[mid]==key) return mid;//查找成功返回所在位置 else if(L.elem[mid]>key) high=mid-1;//从前半部分查找 else low=mid+1;//从后半部分查找 }return -1; } 二叉树的自下而上,从左到有的层次遍历算法 void InvertLevel(BITree bt) {Stack S;Queue Q; if(bt!=NULL) {InitStack(S);InitQueue(Q);EnQueue(Q,bt); while(IsEmpty(Q)==flase)//从上而下层次遍历 {DeQueue(Q,p); Push(S,p);//出队,入栈 if(p->lchild) EnQueue(Q,p->lchild);//左子树不为空,左子树入队 EnQueue(Q,p->rchild);//右子树不为空,右子树入队 if(p->rchild)} while(IsEmpty(s)==flase) {Pop(S,p); visit(p->data);//自下而上,从右到左的层次遍历 } } } while(IsEmpty(s)==flase) {Pop(S,p); visit(p->data); } }} 在单链表中实现直接插入排序 void Sort(LinkList L){LinkList p,pre,q,p1; p=L->next->next; L->next->next=NULL; while(p) {pre=L; q=pre->next; while(q!=NULL&&q->data<p->data) {pre=q; q=q->next; } p1=p->next; p->next=pre->next; pre->next=p; p=p1; }} 给定一个脸部奥,两两交换其中相邻的节点,并返回交换后的链表.你不能只是改变节点内部的值,而是需要实际的进行节点交换 public static ListNode Swap(ListNode head){if(head==null||head,next==null){return head;} ListNode pre=head; ListNode preNext=head,next; ListNode cur=preNext,next; pre,next=cur; preNext.next=pre; head=preNext; while(cur!=null&&cur.next!=null){preNext=cur.next; cur=preNext.next; pre.next.next=cur; preNext.next=pre.next; pre.next=preNext; pre=preNext.next; } return head;}
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #求二叉树宽度算法