void CBinaryTree::AddNode(int N) { CNode *pNode,*pParent=NULL,*pNewNode; pNode=LocateNode(N,pRoot); pParent=LocateParent(N,pRoot); if(pParent==NULL) pRoot=new CNode(N); else { if(pNode==NULL) { pNewNode=new CNode(N,pParent); if(pParent->GetData()>N) pParent->pLeft=pNewNode; else pParent->pRight=pNewNode; } } while(pParent!=NULL) { int iBF=GetBalancingFactor(pParent->pRight)-GetBalancingFactor(pParent->pLeft); if(iBF<-1 || iBF>1) { if(iBF>0) RotateLeft(pNewNode); else RotateRight(pNewNode); if(pNewNode->pParent==NULL) pRoot=pNewNode; } pParent=pParent->pParent; pNewNode=pNewNode->pParent; } }
//用尾插入法建立带头节点的单链表 LinkList CreatListR1() { char ch[10]; LinkList head=(LinkList)malloc(sizeof(ListNode)); ListNode *s,*r,*pp; r=head; r->next=NULL; printf("Input # to end \n"); printf("Please input Node_data:"); scanf("%s",ch); while(strcmp(ch,"#")) { pp=LocateNode(head,ch); if(pp==NULL) { s=(ListNode *)malloc(sizeof(ListNode)); strcpy(s->data,ch); r->next=s; r=s; r->next=NULL; } printf("Input # to end \n"); printf("Please input Node_data:"); scanf("%s",ch); } return head; }
void CBinaryTree::DeleteNode(int N) { CNode *pNode=pRoot,*pParent=NULL; pNode=LocateNode(N,pRoot); pParent=LocateParent(N,pRoot); if(pNode!=NULL) { if(pParent==NULL) { pRoot=pNode->pRight; pParent=FindInsertionPoint(pNode->pLeft->GetData(),pNode->pRight); pParent->pLeft=pNode->pLeft; } else { if(pParent->pLeft==pNode) { if(pNode->pRight==NULL && pNode->pLeft!=NULL) pParent->pLeft=pNode->pLeft; if(pNode->pRight!=NULL && pNode->pLeft==NULL) pParent->pLeft=pNode->pRight; if(pNode->pRight!=NULL && pNode->pLeft!=NULL) { pParent->pLeft=pNode->pRight; pParent=FindInsertionPoint(pNode->pLeft->GetData(),pNode->pRight); if(pParent->GetData()>N) pParent->pLeft=pNode->pLeft; else pParent->pRight=pNode->pLeft; } } else { if(pNode->pRight==NULL && pNode->pLeft!=NULL) pParent->pRight=pNode->pLeft; if(pNode->pRight!=NULL && pNode->pLeft==NULL) pParent->pRight=pNode->pRight; if(pNode->pRight!=NULL && pNode->pLeft!=NULL) { pParent->pLeft=pNode->pRight; pParent=FindInsertionPoint(pNode->pLeft->GetData(),pNode->pRight); if(pParent->GetData()<N) pParent->pLeft=pNode->pLeft; else pParent->pRight=pNode->pLeft; } } } delete pNode; } else cout<<endl<<"Node not found!"; }
int CBinaryTree::GetRightChild(int N) { CNode *pNode=LocateNode(N,pRoot); if(pNode!=NULL) if(pNode->pRight!=NULL) return pNode->pRight->GetData(); else cout<<endl<<"Node didn't have right child!"; else cout<<endl<<"Node not found!"; return 0; }
//删除带头节点的单链表中的制定节点 void DeleteList(LinkList head,char * key) { ListNode *p,*r,*q=head; p=LocateNode(head,key); if(p==NULL) { printf("position error"); exit(0); } while(q->next!=p) q=q->next;//p为要删除的节点,q为p的前节点。该行代码的目的是使q指针移动到p r=q->next; q->next=r->next; free(r); }
//修改程序:增加节点 ListNode * AddNode(LinkList head) { char ch[10]; ListNode * s,* pp; printf("\nPlease input a New Node_data:"); scanf("%s",ch); pp=LocateNode(head,ch); if(pp==NULL){ s=(LinkList)malloc(sizeof(ListNode)); strcpy(s->data,ch); s->next=head->next; head->next=s; } return head; }
int main() { DLinkList *L; int choice; InitList(L); int length; ElemType *a; length = readInput(a); CreateList(L , a ,length); DispList(L); while(1 == scanf("%d",&choice)) { LocateNode(L,choice); DispList(L); } return 0; }