二叉树
定义:每个结点最多只有两棵子树
性质:
1.在第i层上只有2^(i-1)
2.深度为k的二叉树最多有2^k-1个结点
3.T=n0+n1+n2
4.具有n个结点的完全二叉树深度为log2n+1向下取整
满二叉树:没有度为1的结点,所有的结点都在同一层
完全二叉树:必须按照从上到下,从左到右排列结点
存储方式
将二叉树从上到下,从左到右进行标号,则某个结点X的左孩子结点为2X,右孩子结点为2X+1
数组存储
根节点下标为0,左孩子为2X+1,右孩子为2X+2
缺点:耗费空间
适合完全二叉树或满二叉树
链表存储
数据域和指针域(左右)
树的遍历
先序遍历
中序遍历
后序遍历
层序遍历
#include <stdio.h> #include <stdlib.h> typedef struct TreeNode { struct TreeNode *left ,*right ; int data; }node; void traverse (Node *node) { if (node==NULL ) { return ; } traverse(node->left); traverse(node->right); }
层序遍历示例
#include <stdio.h> #include <stdlib.h> #define SIZE 5 int *queue ;int front;int end;int maxSize;typedef struct ChildBro { int key; struct ChildBro *child ; struct ChildBro *sibling ; }Node; Node *root; void Initqueue () { queue =(int *)malloc (sizeof (int )*SIZE); maxSize=SIZE; front=end=0 ; } void insert_queue (int key) { if (isFull()) { return ; } else { end=(end+1 )%maxSize; queue [end]=key; } } void delete_queue (int key) { if (isEmpty()) { return ; } else { front=(front+1 )%maxSize; } } int isFull () { if ((end+1 )%maxSize==front) { return 1 ; } else return 0 ; } int isEmpty () { if (end==front) { return 1 ; } else return 0 ; } void Init (int key) { root=(Node*)malloc (sizeof (Node)); root->key=key; root->child=NULL ; root->silbing=NULL ; } void insert (int key,int parent) { Node* temp; if (temp==NULL ) { } else { Node*node=(Node*)malloc (sizeof (Node)); node->key=key; node->child=NULL ; node->sibling=NULL ; if (temp->child==NULL ) { temp->child=node; } else { node->sibling=temp->child; temp->child=node; } } } void levelOrder (Node* root) { if (root!=NULL ) { insert_queue(root->key); } while (!isEmpty()) { int temp=delete_queue(); get_node(root,temp); if (tempNode->child!=NULL ) { insert_queue(tempNode->child->key) } if (tempNode->sibling!=NULL ) { insert_queue(tempNode->sibling->key) } } }
扩展二叉树(概念)
将一个不是满二叉树的补成一个满二叉树(或完全二叉树)
(将单孩子的结点缺少的结点补成空符号的结点)