二叉树作为重要的树结构,用三叉链表实现可以很方便的查找到一孩子结点的双亲结点。
#ifndef BTREE__H_
#define BTREE__H_
#include<stdio.h>
#include<stdlib.h>
typedef struct TElemType
{
int id;
char name[40];
}TElemType;
/*-------the storage form of binary tree---------*/
typedef struct BiTNode
{
struct TElemType data;
struct BiTNode* lchild, * rchild, * parent;
}BiTNode;
struct BiTNode* CreateBitree(struct BiTNode* child, struct BiTNode* parent);
int BiTreeDepth(struct BiTNode* T);
struct BiTNode* TRoot(struct BiTNode* T);
void Assign(struct BiTNode* T, TElemType old_elem, TElemType new_elem);
void PreOrderTraverse(struct BiTNode* T);
void InOrderTraverse(struct BiTNode* T);
void PostOrderTraverse(struct BiTNode* T);
#endif // !BTREE__H_
/*btree.c*/
#include<stdio.h>
#include"btree.h"
struct BiTNode* CreateBitree(struct BiTNode* child, struct BiTNode* parent)
{
static char ch = 'a';
printf("Enter \"#\" to create null binary tree other not null binary tree:");
ch = getchar();
while (getchar() != '\n')
{
continue;
}
if ((ch != '#') && (parent == NULL))
{
int id = 0, i = 0;
char name[40] = { '\0' };
printf("Enter id:");
scanf("%d", &id);
printf("Enter name:");
scanf("%s", &name);
while (getchar() != '\n')
{
continue;
}
struct BiTNode* new_tnode = (BiTNode*)malloc(sizeof(BiTNode));
parent = new_tnode;
parent->data.id = id;
while (name[i] != '\0')
{
parent->data.name[i] = name[i];
++i;
}
parent->data.name[i] = '\0';
i = 0;
parent->parent = NULL;
parent->lchild = CreateBitree(parent->lchild, parent);
/*执行到此*/
parent->rchild = CreateBitree(parent->rchild, parent);
/*执行到此*/
return parent;
}
else if (ch == '#')
{
return NULL;
}
else {
int id = 0, i = 0;
char name[40] = { '\0' };
printf("Enter id:");
scanf("%d", &id);
printf("Enter name:");
scanf("%s", &name);
while (getchar() != '\n')
{
continue;
}
struct BiTNode* new_tnode = (BiTNode*)malloc(sizeof(BiTNode));
child = new_tnode;
child->data.id = id;
while (name[i] != '\0')
{
child->data.name[i] = name[i];
++i;
}
child->data.name[i] = '\0';
i = 0;
child->parent = parent;
parent = new_tnode;
parent->lchild = CreateBitree(parent->lchild, parent);
/*执行到此*/
parent->rchild = CreateBitree(parent->rchild, parent);
/*执行到此*/
return parent;
}
}
int NodeCount(struct BiTNode* T)
{
if (T == NULL)
return 0;
else
{
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
}
int BiTreeDepth(struct BiTNode* T)
{
int m = 0, n = 0;
if (T == NULL)
return 0;
else
{
m = BiTreeDepth(T->lchild);
n = BiTreeDepth(T->rchild);
if (m > n)
return (m + 1);
else
return (n + 1);
}
}
struct BiTNode* TRoot(struct BiTNode* T)
{
if(T->parent == NULL)
return T;
else
{
while (T->parent)
{
T = T->parent;
}
}
}
void Assign(BiTNode* T, TElemType old_elem, TElemType new_elem)
{
if (T)
{
if (T->data.id == old_elem.id)
{
T->data.id = new_elem.id;
int i = 0;
while (new_elem.name[i] != '\0')
{
T->data.name[i] = new_elem.name[i];
++i;
}
T->data.name[i] = '\0';
Assign(T->lchild, old_elem, new_elem);
Assign(T->rchild, old_elem, new_elem);
}
}
}
void PreOrderTraverse(struct BiTNode* T)
{
if ((T == NULL))
return;
else
{
printf("id : %d\n", T->data.id);
printf("name: %s\n", T->data.name);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(struct BiTNode* T)
{
if (T == NULL)
return;
else
{
printf("id : %d\n", T->data.id);
printf("name: %s\n", T->data.name);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(struct BiTNode* T)
{
if (T == NULL)
return;
else
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("id : %d\n", T->data.id);
printf("name: %s\n", T->data.name);
}
}
在这里插入代码片
gcc 编译运行创建二叉树先序遍历等结果如图。