二叉树简单操作(下)

版权声明:本文为博主原创文章,转载请私信博主。 https://blog.csdn.net/qq_38646470/article/details/79128934

一、二叉树基本操作
 1. 求二叉树的深度。(树的深度:树中所有节点的层次的最大值称为该树的深度)
 2. 求二叉树叶子结点的个数。(叶子节点:度为0的结点称为叶结点,叶节点也称为终端节点)
 3. 求二叉树结点的个数。(节点:结点包括一个数据元素及若干指向其他子树的分支(指针(索引)))
 4. 求二叉树第K层结点的个数。
 5. 判断一个节点是否在一棵二叉树中。
 6. 获取一个节点的双亲结点。(双亲节点:树中某节点有孩子结点,则这个结点称为它孩子结点的双亲结
点,双亲结点也称为前驱结点)
 7. 获取一个节点的左孩子结点。
 8. 求二叉树的镜像(递归&非递归)。
 二叉树的镜像
 9、 判断一棵二叉树是否为完全二叉树(层序遍历变形)。
二、函数代码
1、 求二叉树的高度。

size_t BTreeLenth(BTNode* root) // 求二叉树的高度
{
    if (root==NULL)
    {
        return 0;
    }

    if (BTreeLenth(root->left)>=BTreeLenth(root->right))  //返回左右高度中高的一个再加一
        return BTreeLenth(root->left)+1;
    else
        return BTreeLenth(root->right)+1;

}

 2. 求二叉树叶子结点的个数。
 

size_t BTreeLeafNumber(BTNode* root) //求二叉树叶子结点的个数
{
    if (root == NULL)  //递归结束条件
    {
        return 0;
    }

    if (NULL == root->right)   //当左边为NULL时,如果右边也为NULL,则为叶子节点
        return 1;

    return BTreeLeafNumber(root->left)+BTreeLeafNumber(root->right);  //左子树叶子+右子树叶子
}

 3. 求二叉树结点的个数。
 

size_t BTreeNodeNumber(BTNode *root)// 求二叉树结点的个数
{
    if (NULL == root)  //递归结束条件
    {
        return 0;
    }

    return BTreeNodeNumber(root->left) + BTreeNodeNumber(root->right)+1; //左子树节点数 + 右子树节点 + 1
}

 4. 求二叉树第K层结点的个数。
 

size_t BTreeKLevelNodeNumber(BTNode* root, size_t k) //求二叉树第K层结点的个数
{
    if (root == NULL || k<1)
    {
        return 0;
    }

    if (k==1)
    {
        return 1;
    }
    //二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数   
    return BTreeKLevelNodeNumber(root->left,k-1) + BTreeKLevelNodeNumber(root->right,k-1);
}

 5. 判断一个节点是否在一棵二叉树中。
 

BTNode* BTreeNodeFind(BTNode* root, BTDataType x) //判断一个节点是否在一棵二叉树中(层序遍历比较)
{
    Queue q;
    BTNode *tmp = root;
    QueueInit(&q);
    QueuePush(&q,tmp);
    while (QueueEmpty(&q)) //取队头元素访问,并同时入队该元素的左右非空子树节点
    {
        BTNode *front = QueueFront(&q);
        QueuePop(&q);
        if (front->data == x) //找到该元素则返回该元素地址
        {
            return front;
        }
        if (front->left)
        {
            QueuePush(&q,front->left);
        }
        if (front->right)
        {
            QueuePush(&q,front->right);
        }
    }
    return NULL; //没找到
}

 6. 获取一个节点的双亲结点。
 

BTNode* GetBTreeParents(BTNode *root,BTNode *node) //获取一个节点的双亲结点(层序遍历)
{
    Queue q;
    BTNode *tmp = root;
    if (root == node)  //该节点为根节点
    {
        return NULL;
    }
    QueueInit(&q);
    QueuePush(&q,tmp);
    while (QueueEmpty(&q)) //取队头元素访问,并同时入队该元素的左右非空子树节点
    {
        BTNode *front = QueueFront(&q);
        QueuePop(&q);

        if (front->left == node)
            return front;
        else
            QueuePush(&q,front->left);
        if (front->right == node)
            return front;
        else
            QueuePush(&q,front->right);
    }
    return NULL; //没有该节点
}

 7. 获取一个节点的左孩子结点。
 

BTNode* GetNodeLeftChild(BTNode *root,BTNode *node)//获取一个节点的左孩子结点(层序遍历)
{
    Queue q;
    BTNode *tmp = root;
    QueueInit(&q);
    QueuePush(&q,tmp);
    while (QueueEmpty(&q)) //取队头元素访问,并同时入队该元素的左右非空子树节点
    {
        BTNode *front = QueueFront(&q);
        QueuePop(&q);

        if (front== node)
            return front->left;
        else
        {
            QueuePush(&q,front->left);
            QueuePush(&q,front->right);
        }
    }
    return NULL; //没有该节点
}

 8. 求二叉树的镜像(①递归②非递归)。
 
①递归法求二叉树的镜像。

BTNode* BTreeMirrorR(BTNode *root)// 求二叉树的镜像(递归)
{
    if (root == NULL)
    {
        return NULL;
    }
    BTreeMirrorR(root->left);
    BTreeMirrorR(root->right);
    Swap(&root->left,&root->right);  //左右交换

    return root;
}

②迭代法求二叉树的镜像。

BTNode* BTreeMirror(BTNode *root)// 求二叉树的镜像(非递归)
{
    Stack s;
    BTNode *top = NULL;
    BTNode *tmp = root;
    StackInit(&s);
    while (StackEmpty(&s) != 0 || NULL != tmp) 
    {
        while (tmp) //遍历左子树
        {
            StackPush(&s,tmp); //左子树不为空则入栈
            tmp = tmp->left;
        }

        top = StackTop(&s); //左子树为空,取栈顶
        Swap(&top->left,&top->right);
        StackPop(&s);

        tmp = top->right; //右子树
    }
    return root;
}

9、 判断一棵二叉树是否为完全二叉树(层序遍历变形)。

size_t CheckBTree(BTNode *root)// 判断一棵二叉树是否为完全二叉树(层序遍历变形)
{
    Queue q;
    BTNode *tmp = root;
    QueueInit(&q);
    QueuePush(&q,tmp);
    while (QueueEmpty(&q)) //取队头元素访问,并同时入队该元素的左右非空子树节点
    {
        BTNode *front = QueueFront(&q);
        if (front)
            QueuePop(&q);
        else
            break;
        QueuePush(&q,front->left);
        QueuePush(&q,front->right);
    }
    while (QueueEmpty(&q)) //如果从第一个空元素后面没有非空元素,则是完全二叉树,否则,不是。
    {
        BTNode *front = QueueFront(&q);
        if (front)
        {
            return 0;
        }
        QueuePop(&q);
    }
    return 1;
}

文中涉及到栈和队列的知识请戳栈和队列基本知识

完整源代码请戳二叉树基本操作(下)完整源码

没有更多推荐了,返回首页