二叉树(Binary Tree)是一种树状数据结构,它由节点(node)构成,每个节点最多有两个子节点,分别称为左子节点和右子节点。这两个子节点有顺序之分,通常称为左子树和右子树。二叉树具有以下基本特点:
1.根节点(Root): 树的顶端节点,没有父节点。
2.叶子节点(Leaf): 没有子节点的节点,位于树的末端。
3.内部节点(Internal Node): 既有父节点又有子节点的节点。
4.子树(Subtree): 由节点及其后代节点组成的树。
5.深度(Depth): 从根节点到某个节点的唯一路径的长度。
6.高度(Height): 从某节点到一棵树的叶子节点的最长路径的长度。
二叉树可以分为不同类型,取决于节点的子节点数目和节点排列的规则。以下是一些常见的二叉树类型:
1.满二叉树(Full Binary Tree): 所有节点都有零或两个子节点,每一层都被完全填满。
2.完全二叉树(Complete Binary Tree): 除了最后一层,其他层都被完全填满,而且最后一层的节点都靠左排列。
3.平衡二叉树(Balanced Binary Tree): 任意节点的左右子树的高度差不超过1。
4.二叉搜索树(Binary Search Tree): 左子树上的节点值小于父节点,右子树上的节点值大于父节点,且左右子树都是二叉搜索树。
一、创建二叉树
void CreateBiTree(BiTree &T)
{
char ch;
cin >> ch;
if(ch == '#') T = NULL;
else{
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
二、查找值为key的并把它赋给q
void Search(BiTree T, BiTNode *q, int key)
{
if(T != NULL)
{
if(T->data == key) q = T;
Search(T->lchild, q, key);
Search(T->rchild, q, key);
}
}
三、查找x所在的层
void Search_x_level(BiTree T, int x, int level)
{
if(T != NULL)
{
if(T->data == x)
cout << level;
Search_x_level(T->lchild, x, level + 1);
Search_x_level(T->rchild, x, level + 1);
}
}
四、层次遍历二叉树
void LevelOrder(BiTree T)
{
Queue Q;
InitQueue(Q);
BiTNode *p = T;
EnQueue(Q, p);
while(!IsEmpty(Q))
{
DeQueue(Q, p);
cout << p->data;
if(p->lchild) EnQueue(Q,p->lchild);
if(p->rchild) EnQueue(Q,p->rchild);
}
}
五、判断是否为完全二叉树
int IsComplete(BiTree T)
{
if(T == NULL) return 1;
Queue Q;
InitQueue(Q);
BiTNode *p = T;
EnQueue(Q, p);
while(!IsEmpty(Q))
{
DeQueue(Q, p);
if(p != NULL)
{
EnQueue(Q, p->lchild);
EnQueue(Q, p->rchild);
}
else
{
while(!IsEmpty(Q))
{
DeQueue(Q, p);
if(p != NULL) return 0;
}
}
}
return 1;
}
六、删除值为x的所有子树
void DeleteTree(BiTree &T)
{
if(T != NULL)
{
DeleteTree(T->lchild);
DeleteTree(T->rchild);
delete T;
}
}
void Search_x(BiTree &T, int x)
{
if(T == NULL) return;
if(T->data == x)
{
DeleteTree(T);
return;
}
Queue Q;
InitQueue(Q);
BiTNode *p = T;
EnQueue(Q, p);
while(!IsEmpty(Q))
{
DeQueue(Q,p);
if(p->lchild)
{
if(p->lchild->data == x)
{
DeQueue(Q, p->lchild);
p->lchild = NULL;
}
else
EnQueue(Q, p->lchild);
}
if(p->rchild)
{
if(p->rchild->data == x)
{
DeQueue(Q, p->rchild);
p->rchild = NULL;
}
else
EnQueue(Q, p->rchild);
}
}
}
七、非递归求树的高度
int Depth(BiTree T)
{
int j = 0, last = 0;
BiTNode *Q[10000];
int front = -1, rear = -1;
BiTNode *p = T;
Q[++rear] = p;
while(front < rear)
{
p = Q[++front];
if(p->lchild)
{
Q[++ rear] = p->lchild;
}
if(p->rchild) Q[++ rear] = p->rchild;
if(front == last)
{
h ++;
last = rear;
}
}
return h;
}