1. 程式人生 > >樹的左旋與右旋

樹的左旋與右旋

下圖所示操作稱為對結點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;
	}

}