二叉树的二叉链表的数据结构
typedef struct BTNode
{
elementType data;
struct BTNode *LChild,*RChild;
}BiTnode,*BTree;
data,lchild,rchild分别存储结点的元素及左右指针域。
二叉树创建递归算法
int CreateBTree(BTree *BT)
{
scanf(&ch);
if(ch == '#')
{
BT = NULL;
}
else{
if(!(BT = (BiTNode*)malloc(sizeof(BiTNode))))
{
printf("没有足够的空间!\n");
return -1;
}
BT->data = ch;
CreateBTree(BT->LChild);
CreateBTree(BT->RChild);
}
return 0;
}
二叉树创建非递归算法
typedef char elemtype;
struct bitree
{
elemtype data;
bitree *lchild,*rchild;
};
bitree *create()
{
bitree *q[100];//定义q数组作为队列存放二叉链表中结点,100为最大值
bitree *s;//二叉链表中的结点
bitree *root;//二叉链表的根指针
int front = 1,rear = 0;//定义队列的头、尾指针
char ch;
root = NULL;
cin >> ch;
while(ch!='#')
{
s = NULL;
if(ch != ',')//输入数据不为逗号,表示不为虚节点,否则为虚节点
{
s = new bitree;
s -> data = ch;
s -> lchild = NULL;
s -> rchild = NULL;
}
rear++;
q[rear]=s;//新结点或虚节点进队
if(rear == 1)
{
root = s;
}else{
if((s != NULL) && (q[front] != NULL))
{
if(rear % 2 == 0)
{
q[font] -> lchild = s;//rear 为偶数,s为双亲左孩子
}else{
q[front]->rchild = s; //rear为奇数,s为双亲右孩子
}
if(rear % 2 == 1)//出队
{
front++;
}
}
cin >> ch;
}
return root;
}
}
二叉树的操作
1、建立一颗空二叉树:InitialBTree(BT)
初始化条件:无
操作结果:构造一颗空树BT。
2、按某种规则建立一颗二叉树:CreateBTree(BT)
初始条件:无
操作结果:按某种规则构造一颗二叉树BT。
3、求二叉树BT的树根结点:RootBTree(BT)
初始条件:二叉树BT已存在;
操作结果:返回二叉树BT的根结点。
4、求二叉树BT中结点p的双亲:ParentBTree(BT,p)
初始条件:二叉树BT已经存在,且p是二叉树BT中的一个结点;
操作结果:若结点p不是二叉树BT的根结点,则返回结点p的双亲结点;否则,返回NULL。
5、求二叉树BT中结点p的左孩子结点:LeftChildBTree(BT,p)
初始化条件:二叉树BT已经存在,且p是二叉树BT中的一个结点;
操作结果:若结点p不是二叉树BT的叶子结点,则返回结点p的左孩子结点;否则,返回NULL。
6、求二叉树BT中结点p的右孩子结点了;RightChildBTree(BT,p)
初始化条件:二叉树BT已经存在,且结点p是二叉树BT中的一个结点;
操作结果:若结点p不是二叉树BT的叶子结点,则返回结点p的右孩子结点,否则返回NULL;
7.判断二叉树BT是否为空:EmptyBTree(BT)
初始条件:二叉树BT已经存在;
操作结果:若二叉树BT为空,则返回TRUE;否则,返回false。
8、求二叉树BT的深度:DepthBTree(BT)
初始化条件:二叉树BT已经存在:
操作结果:返回二叉树BT的深度。
9、将结点p作为二叉树BT中结点q的左子树插入:InsertLeftBTree(BT,p,q)
初始条件:二叉树BT已经存在,且结点q是二叉树BT中的结点;
操作结果:将结点p作为二叉树BT中结点q的左子树插入。
10、将结点p作为二叉树BT中结点q的右子树插入:InsertLeftBTree(BT,p,q)
初始条件:二叉树BT已经存在,且结点q是二叉树BT中的结点;
操作结果:将结点p作为二叉树BT中结点q的右子树插入。
11、在二叉树BT中删除结点p的左子树:DeleteLChBTree(BT,p)
初始化条件:二叉树BT已经存在,结点p是二叉树BT中的结点;
操作结果:在二叉树BT中删除结点p的左子树。
12、在二叉树BT中删除结点p的右子树:DeleteLChBTree(BT,p)
初始化条件:二叉树BT已经存在,结点p是二叉树BT中的结点;
操作结果:在二叉树BT中删除结点p的右子树。
13、给二叉树BT中结点p赋值:AssignNodeBTree(T,p,x)
初始条件:二叉树BT已经存在,且结点p是二叉树BT中的结点。
操作结果:将x赋值给二叉树BT中的结点p。
14、求二叉树BT中结点p的左子树:GetLChBTree(BT,p)
初始条件:二叉树BT已经存在,结点p是二叉树BT中的结点;
操作结果:若p是非叶子结点,则返回结点p的左子树,否则返回NULL。
15、求二叉树BT中结点p的右子树:GetLChBTree(BT,p)
初始条件:二叉树BT已经存在,结点p是二叉树BT中的结点;
操作结果:若p是非叶子结点,则返回结点p的右子树,否则返回NULL。
16、按前序遍历方式遍历二叉树BT:PreOrderTraverseBTree(BT)
初始化条件:二叉树BT已经存在;
操作结果:按前序遍历方式遍历二叉树BT,返回前序遍历序列。
17、按中序遍历方式遍历二叉树BT:InOrderTraverseBTree(BT)
初始化条件:二叉树BT已经存在;
操作结果:按中序遍历方式遍历二叉树BT,返回中序遍历序列。