学习参考: 严蔚敏: 《数据结构-C语言版》
基本操作
代码实现
二叉树结构定义
typedef struct node
{
char data;
struct node *lchild, *rchild;
}BiTNode,* BiTree;
创建二叉树
BiTree CreateBiTree(BiTree t)
{
char ch;
scanf("%c", &ch);
if (ch == '#')
t = NULL;
else
{
t = (BiTree)malloc(sizeof(BiTNode));
t->data = ch;
CreateBiTree(t->lchild);
CreateBiTree(t->rchild);
}
return t;
}
先序遍历(递归)
int preOrderTraverse(BiTree t)
{
if (!t)
return 0;
printf("%c", t->data);
preOrderTraverse(t->lchild);
preOrderTraverse(t->rchild);
return 1;
}
中序遍历(递归)
int inOrderTraverse(BiTree t)
{
if (!t)
return 0;
inOrderTraverse(t->lchild);
printf("%c", t->data);
inOrderTraverse(t->rchild);
return 1;
}
后序遍历(递归)
int postOrderTraverse(BiTree t)
{
if (!t)
return 0;
inOrderTraverse(t->lchild);
inOrderTraverse(t->rchild);
printf("%c", t->data);
return 1;
}
层次遍历
int levelTraverse(BiTree t)
{
BiTree Tqueue[100];
BiTNode* p = NULL;
int front, rear;
front = rear = 0;
if (t)
{
rear = (rear + 1) % 100;
Tqueue[rear] = t;
while (rear != front)
{
front = (front + 1) % 100;
p = Tqueue[front];
printf("%c", p->data);
if (p->lchild)
{
rear = (rear + 1) % 100;
Tqueue[rear] = p->lchild;
}
if (p->rchild)
{
rear = (rear + 1) % 100;
Tqueue[rear] = p->rchild;
}
}
}
return 1;
}
先序遍历(非递归)
int preOrderTraverseEx(BiTree t)
{
BiTree arr[100];
BiTNode* temp = NULL;
int len = 0;
if (t)
{
arr[len] = t;
len++;
while (len != 0)
{
temp = arr[len - 1];
while (temp)
{
printf("%c\n", temp->data);
arr[len] = temp->lchild;
len++;
temp = arr[len - 1];
}
temp = arr[len - 1];
len--;
if (len != 0)
{
temp = arr[len - 1];
len--;
arr[len] = temp->rchild;
len++;
}
}
return 1;
}
return 0;
}
中序遍历(非递归)
int inOrderTraverseEx(BiTree t)
{
BiTree arr[100];
BiTNode* temp = NULL;
int len = 0;
if (t)
{
arr[len] = t;
len++;
while (len!=0)
{
temp = arr[len - 1];
while (temp)
{
arr[len] = temp->lchild;
len++;
temp = arr[len - 1];
}
temp = arr[len - 1];
len--;
if (len!=0)
{
temp = arr[len - 1];
len--;
printf("%c\n", temp->data);
arr[len] = temp->rchild;
len++;
}
}
return 1;
}
return 0;
}
后序遍历(非递归)
int postOrderTraverseEx(BiTree t)
{
BiTree arr[100];
BiTNode* pre = NULL,* temp = t;
int len = 0;
if (temp)
{
while (temp || !(len == 0))
{
while (temp)
{
arr[len] = temp;
len++;
temp = temp->lchild;
}
if (!(len == 0))
{
temp = arr[len - 1];
if (temp->rchild != NULL && temp->rchild != pre) // 右节点存在且没有被访问过
{
arr[len] = temp;
temp = temp->rchild;
}
else
{
printf("%c\n", temp->data);
pre = temp;
temp = NULL;
}
}
}
return 1;
}
return 0;
}
查询
int search(BiTree t, BiTNode* q, int key)
{
BiTree p = t;
if (p != NULL)
{
if (p->data == key)
q = p;
else
{
search(p->lchild, q, key);
search(p->lchild, q, key);
}
return 1;
}
return 0;
}
改进版查询
int search(BiTree p, BiTNode* q, int key)
{
if (p)
{
if (p->data == key)
q = p;
else
{
search(p->lchild, q, key);
if (q == NULL)
search(p->rchild, q, key);
}
return 1;
}
return 0;
}
求树的深度
int getTreeDepth(BiTree t)
{
int lchildHeight, rchildHeight;
if (t == NULL)
return 0;
lchildHeight = getTreeHeight(t->lchild);
rchildHeight = getTreeHeight(t->rchild);
return (lchildHeight > rchildHeight) ? (1 + lchildHeight) : (1 + rchildHeight);
}
求叶子结点
int getTreeAllLeafNodeCount(BiTree t)
{
if (t == NULL)
return 0;
if (t->lchild == NULL && t->rchild == NULL)
return 1;
else
{
return getTreeAllNodeCount(t->lchild) + getTreeAllLeafNodeCount(t->rchild);
}
}
求结点数
int getTreeAllNodeCount(BiTree t)
{
if (t == NULL)
return 0;
return getTreeAllNodeCount(t->lchild) + getTreeAllNodeCount(t->rchild);
}
销毁二叉树
int destroyTree(BiTree t)
{
BiTNode* p = NULL,* pr = NULL;
if (t == NULL)
return 0;
p = t->lchild;
pr = t->rchild;
t->lchild = NULL;
t->rchild = NULL;
free(t);
t = NULL;
destroyTree(p);
destroyTree(pr);
return 1;
}
写在最后
文章记录本人学习所得, 如有所错误, 欢迎留言指出交流, 大神请键盘下留人 ! ! !