本人的代码有借鉴了大话数据结构的代码,以及网上各位大神的算法,中间还得到了同学的帮助。在这里感谢大家~可能我写的代码看起来比较(⊙o⊙)…低龄的感觉,但是真的尽力了啊TAT
这个为二叉树定义的类:
class BiThrNode
{
public:
NodeType data;
BiThrNode *lchild,*rchild;//指向左孩子和右孩子的指针
int LTag;//左标志
int RTag;//右标志
};
因为想创建前序线索二叉树所以设置了LTag和RTag标志,如果是普通的二叉树的话就没有必要设置。
这个是创建的函数:
void CreateTree(BiThrNode *(&T))//创建二叉树此处使用引用,因为递归的值需要传导
{
in.read(&data,1);//这里是利用文件内容创建二叉树
if(data=='#')//二叉树类似AB#C##D##
{
T=NULL;//当输入的值为#时,意味着左节点和右节点的值为NULL,即上层函数不存在左右子树
}
else
{
if(!T)
{
return;//返回上层函数
}
T->data = data;
T->lchild = new BiThrNode;//开辟左孩子的空间
CreateTree(T->lchild);//这里递归的也是指针
T->rchild = new BiThrNode;//开辟右指针的空间
CreateTree(T->rchild);
}
}
前序遍历
void PreOrderTraverse(BiThrNode *(&T))
{
if(T ==NULL)
return;
cout<<T->data<<" ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
中序遍历
void InOrderTraverse(BiThrNode *T)
{
if(T ==NULL)
return;
PreOrderTraverse(T->lchild);
cout<<T->data<<" ";
PreOrderTraverse(T->rchild);
}
后序遍历
void PostOrderTraverse(BiThrNode *T)
{
if(T ==NULL)
return;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
cout<<T->data<<" ";
}
递归删除二叉树的左子树和右子树
void del(BiThrNode *(&T1))
{
if (T1 != NULL) {
del(T1->lchild);
del(T1->rchild);
delete T1;
T1 = NULL;
}
}
递归删除结点数据
void Delete_Node(BiThrNode *(&T1),NodeType data)
{
if(T1 == NULL)
return;
if(T1->data == data)
{
del(T1);//调用了del函数
}
else
{
Delete_Node(T1->lchild,data);
Delete_Node(T1->rchild,data);
}
}
找父节点 利用了递归的思想,基本结构还是前序遍历
void Find_Father(BiThrNode *(&T),NodeType data)
{
if(T ==NULL)
return;
if(T->lchild != NULL)//当左孩子存在的时候才进行判断,否则程序出错
{
if(T->lchild->data == data)
{
cout<<"该节点的父结点是:"<<T->data;
flag4 = true;//全局变量设置了一个标志flag4=false,如果找到父结点,则flag4赋值为true
}
}
if(T->rchild != NULL)//如左子树所示
{
if(T->rchild->data == data)
{
cout<<"该节点的父结点是:"<<T->data
flag4 = true;
}
}
Find_Father(T->lchild,data);
Find_Father(T->rchild,data);
}
找父节点
void findfather(BiThrNode *(&T),NodeType data)
{
Find_Father(T,data);//执行递归函数
if(flag4 == false)
{
cout<<"你搜索的结点为根节点或你搜索的结点在该二叉树中不存在";判断条件
}
}
找寻结点跟找寻父结点的做法十分类似,只需要把判断的条件改成T->data == data即可,另外不需要判断左右子树是否存在的情况