二叉树相关操作

创建二叉树

  1. 从键盘输入字符创建二叉树
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;
    }
}

核心思想:同查找结点是同样的思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值