创建二叉树
- 从键盘输入字符创建二叉树
BTree CreateTleft()
{
BinaryTree* temp = NULL;
ElemType a = 0;
scanf_s("%c", &a);
if (a != '#')
{
temp = BuyNode();
temp->data = a;
temp->leftchild = CreateTleft();//先建立左孩子,再建立右孩子,左孩子递归遇到空返回,再递归右孩子
temp->rightchild = CreateTleft();
}
return temp;
}
核心思想:输入字符,判断该字符是否为空,上面的代码以#代表空(NULL),若不为空,建立新的结点,将字符赋值给该结点,并对该结点的左孩子和右孩子进行相同的遍历。
1.2创建树,不同的传值方式
BTree CreateTmiddle_string(char** const p)
{
BinaryTree* node = NULL;
if (**p != '#' && *p != NULL && **p != NULL)
{
node = BuyNode();
node->data = (**p);
node->leftchild = CreateTmiddle_string(&(++*p));
node->rightchild = CreateTmiddle_string(&(++*p));
}
return node;
}
核心思想:和第一个创建树的思路是一样的,不同的是其传值方式不同,采用了二级指针的方式,用到了引用,希望后续可以看看这方面的书。
2.查找二叉树的大小
int Size_BiTree(BinaryTree* ptr)
{
if (ptr != NULL)
{
return (Size_BiTree(ptr->leftchild)+Size_BiTree(ptr->rightchild)+1);
}
return 0;
}
核心思想:一颗树的结点个数等于左子树结点数加右子树的结点数加1,递归思想,查找每个节点。
3.遍历第K层结点
void floor_orderk(BinaryTree* ptr, int k)//遍历第几层的结点
{
if (ptr == NULL || k < 0)
{
return;
}
degreeorderk(ptr, k);
}
void degreeorderk(BinaryTree* ptr, int k)
{
if (ptr != NULL&&k == 0)
{
printf("%c ", ptr->data);
}
if (ptr->leftchild != NULL)
{
degreeorderk(ptr->leftchild,k-1);
}
if (ptr->rightchild != NULL)
{
degreeorderk(ptr->rightchild,k-1);
}
}
核心思想:遍历每个节点,若该结点在第K层则打印出来,通过传递k值来确定是否在第k层。若打印第0层,则只需要递归一次,若需要打印第5层,则需要递归5次,所以用k是否递归到,及减减的次数来判断。
4.判断两个树是否相同
bool Equal(BinaryTree *pa, BinaryTree *pb)
{
if (pa != NULL&&pb != NULL&&pa->data==pb->data)
{
Equal(pa->leftchild, pb->leftchild);
Equal(pa->rightchild, pb->rightchild);
return true;
}
return false;
}
核心思想:同时遍历两个树的左右孩子和根节点,比较值和结构是否相同。
5.查找双亲结点
BTree Parent(BinaryTree *ptr, BinaryTree *child)
{
if (ptr==NULL||ptr->leftchild== child || ptr->rightchild == child)
{
return ptr;
}
else
{
BinaryTree* s = Parent(ptr->leftchild, child);
if (s == NULL)
{
s = Parent(ptr->rightchild, child);
}
return s;
}
}
核心思想:遍历每个节点,若其左右孩子中有一个为child结点,则返回该结点,否则向下遍历。
6.按值查找结点
BTree FindValue(BinaryTree *ptr, ElemType x)
{
if (ptr == NULL|| ptr->data == x)
{
return ptr;
}
else
{
BinaryTree* s = FindValue(ptr->leftchild, x);
if (s == NULL)
{
s = FindValue(ptr->rightchild, x);
}
return s;
}
}
核心思想:同查找结点是同样的思路。