樹的左旋與右旋
阿新 • • 發佈:2019-01-10
下圖所示操作稱為對結點Q的右旋,對結點P的左旋。二者互為逆操作。
簡單講,右旋——自己變為左孩子的右孩子;左旋——自己變為右孩子的左孩子。
#include class BinTree{ private: typedef struct node{ int data; node*lchild,*rchild,*parent; }*tree; tree root; public: void right_rotate(node *p); void left_rotate(node *p); }; void BinTree::right_rotate(node *q){ node* p=q->lchild; node* b=p->rchild; node* fa=q->parent; b->parent=q; q->lchild=b; q->parent=p; p->rchild=q; if(q==root) root=p;//此時p->parent==q 但沒關係,已經標記了根為p else{ p->parent=fa; if(fa->lchild==q) fa->lchild=p; else fa->rchild=p; } } void BinTree::left_rotate(node *p){ tree q=p->rchild; tree b=q->lchild; node* fa=p->parent; b->parent=p; p->rchild=b; p->parent=q; q->lchild=p; if(p==root) root=q;//此時q->parent==p 但沒關係,已經標記了根為q else{ q->parent=fa; if(fa->lchild==p) fa->lchild=q; else fa->rchild=q; } }