数据结构--树

二叉树

层序遍历二叉树

给定一棵二叉树,要求分层遍历该二叉树,即从上到下按层次访问该树,每一层单独输出一行,每一层要求访问的顺序为从左到右。

我们在遍历的过程中将该层节点的孩子节点压入一个队列,这样就可以实现从上到下一层一层地遍历该二叉树。

//层序遍历 并分层打印 如果不用分层的话只用队列实现就行了,不需要内层循环
void printTreeLevel(pnode root){	
	queue<pnode> q;
	pnode nd;
	int lnum;
	q.push(root);
	while(!q.empty()){
		lnum=q.size();
		while(lnum){
			nd = q.front();
			printf(" %d ",nd->key);
			q.pop();
			lnum--;
			if(nd->left!=NULL) q.push(nd->left);
			if(nd->right!=NULL) q.push(nd->right);
		}
		printf("\n");
	}
}


二叉搜索树

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

二叉搜索树的建立

typedef struct node{
	keyType key;
	struct node *left;
	struct node *right;
	struct node *parent;
} node,*pnode;

void insert(pnode *root, keyType key){
	pnode p = (pnode)malloc(sizeof(node));
	p->key = key;
	p->parent = p->left = p->right = NULL;
	if(*root==NULL){
		*root = p;
		return;
	}
	if((*root)->left==NULL&&(*root)->key>key) {
		p->parent=(*root);
		(*root)->left=p;
		return;
	}
	if((*root)->right==NULL&&(*root)->key<key) {
		p->parent=(*root);
		(*root)->right=p;
		return;
	}
	if((*root)->key>key) insert(&((*root)->left),key);
	else if((*root)->key<key) insert(&((*root)->right),key);
	else return;
}

void create(pnode *root, keyType *nodeArray, int length){
	int i;
	for(i=0;i<length;i++){
		insert(root,nodeArray[i]);
	}
}
int main(){
<span style="white-space:pre">	</span>int i;
<span style="white-space:pre">	</span>pnode root=NULL;
<span style="white-space:pre">	</span>keyType nodeArray[11]={15,6,18,3,7,17,20,2,4,13,9};
<span style="white-space:pre">	</span>create(&root,nodeArray,11);
<span style="white-space:pre">	</span>//printTree(root);
<span style="white-space:pre">	</span>//printTreeLevel(root);
}

平衡二叉树(AVL树)


含有相同节点的二叉查找树可以有不同的形态,而二叉查找树的平均查找长度与树的深度有关,所以需要找出一个查找平均长度最小的一棵,那就是平衡二叉树(图b),具有以下性质:
(1)要么是棵空树,要么其根节点左右子树的深度之差的绝对值不超过1;
(2)其左右子树也都是平衡二叉树;
(3)二叉树节点的平衡因子定义为该节点的左子树的深度减去右子树的深度。则平衡二叉树的所有节点的平衡因子只可能是-1,0,1。

动画演示平衡二叉树的旋转

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值