二叉树的操作实现
(1),节点结构体定义:
typedef struct Node{
DataType data; //数值域
struct Node *leftChild; //左子树指针
struct Node *rightChild; //右子树指针
}BiTreeNode;
(2),初始化
void Initiate(BiTreeNode **root)
{
*root = (BiTreeNode *)malloc(sizeof(BiTreeNode));
(*root)->leftChild = NULL;
(*root)->rightChild = NULL;
}
(3),左插入节点
//若当前节点curr非空,则在curr的左子树插入元素值为x的新节点
//原curr所指结点的左子树成为新插入的节点的左子树
//若插入成功,则返回新插入节点的指针,否则返回空指针
BiTreeNode *InsertLeftNode(BiTreeNode *curr, DataType x)
{
BiTreeNode *s, *t;
if(curr == NULL)
{
return NULL;
}
t = curr->leftChild; //保留原curr所指结点的左子树指针
s = (BiTreeNode *)malloc(sizeof(BiTreeNode));
s->data = x;
s->leftChild = t; //新插入节点的左子树为原curr的左子树
s->rightChild = NULL;
curr->leftChild = s; //新节点成为curr的左子树。
return curr->leftChild; //返回新插入节点的地址
}
(4),右插入节点
//若当前节点curr非空,则在curr的右子树插入元素值为x的新节点
//原curr所指结点的右子树成为新插入的节点的右子树
//若插入成功,则返回新插入节点的指针,否则返回空指针
BiTreeNode *InsertRightNode(BiTreeNode *curr, DataType x)
{
BiTreeNode *s, *t;
if(curr == NULL)
{
return NULL;
}
t = curr->rightChild; //保留原curr所指结点的左子树指针
s = (BiTreeNode *)malloc(sizeof(BiTreeNode));
s->data = x;
s->rightChild = t; //新插入节点的左子树为原curr的左子树
s->leftChild = NULL;
curr->rightChild = s; //新节点成为curr的左子树。
return curr->rightChild; //返回新插入节点的地址
}
(5),左删除节点
//若curr非空,则删除curr所指结点的左子树
//若删除成功,则返回删除节点的双亲结点指针, 否则返回空指针。
BiTreeNode *DeleteLeftNode(BiTreeNode *curr)
{
if((curr == NULL) || (curr>leftChild == NULL))
{
return NULL;
}
Destroy(&curr->leftChild);
curr->leftChild = NULL;
return curr;
}
(6),右删除节点
//若curr非空,则删除curr所指结点的右子树
//若删除成功,则返回删除节点的双亲结点指针, 否则返回空指针。
BiTreeNode *DeleteLeftNode(BiTreeNode *curr)
{
if((curr == NULL) || (curr>rightChild == NULL))
{
return NULL;
}
Destroy(&curr->rightChild);
curr->rightChild = NULL;
return curr;
}