二叉树
层序遍历二叉树
给定一棵二叉树,要求分层遍历该二叉树,即从上到下按层次访问该树,每一层单独输出一行,每一层要求访问的顺序为从左到右。
我们在遍历的过程中将该层节点的孩子节点压入一个队列,这样就可以实现从上到下一层一层地遍历该二叉树。
//层序遍历 并分层打印 如果不用分层的话只用队列实现就行了,不需要内层循环
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。
(1)要么是棵空树,要么其根节点左右子树的深度之差的绝对值不超过1;
(2)其左右子树也都是平衡二叉树;
(3)二叉树节点的平衡因子定义为该节点的左子树的深度减去右子树的深度。则平衡二叉树的所有节点的平衡因子只可能是-1,0,1。