数据结构-树二叉树的相关算法

Posted Mount256

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-树二叉树的相关算法相关的知识,希望对你有一定的参考价值。

文章目录

1 计算二叉树中双分支结点的个数

假设二叉树采用二叉链表存储,试设计一个算法,计算一棵给定二叉树的所有双分支结点个数。

int count = 0;

void Degree2 (BiTree T)
    if (T != NULL)
        Degree2(T->lchild);
        Degree2(T->rchild);
        if ((T->lchild != NULL) && (T->rchild != NULL))
            count++;   
    
 

2 交换二叉树中所有左右子树

编写一个把树 B 中所有结点的左、右子树进行交换的函数。

void SwapNodeChild (BiTree T)
    if (T->lchild != NULL)
        SwapNodeChild(T->lchild);
    if (T->rchild != NULL)
        SwapNodeChild(T->rchild);

    Swap(T->lchild, T->rchild);

3 求先序遍历第 k 个元素

设计一个算法,求先序遍历序列中第 k 个结点的值。

int i = 1;

int PreOrder (BiTree T, int k)
    if (T != NULL)
        if (i == k)
            return T->data;
        i++;
        
        PreOrder(T->lchild, k);
        PreOrder(T->rchild, k);
    

4 删去值为 x 的子树

对于树中每个元素值为 x 的结点,删去以它为根的子树,并释放相应的空间。

void Delete (BiTree T) // 找到元素值为 x 的结点后,递归删去它的左子树和右子树
    if (T != NULL)
        Delete(T->lchild);
        Delete(T->rchild);
        free(T);
    


void Find (BiTree T, int x)
    if (T != NULL)
        if (T->data == x) // 若找到元素值为 x 的结点
            Delete(T);     // 开始递归删去它的左子树和右子树
            return;
        
        else // 若不是元素值为 x 的结点
            Find(T->lchild, x); // 继续找左子树中有无元素值为 x 的结点
            Find(T->rchild, x); // 继续找右子树中有无元素值为 x 的结点
        
    

5 计算二叉树的带权路径长度(WPL)

二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树 T,采用二叉链表存储结点结构为

leftweightright
左子树指针域权值右子树指针域

其中叶结点的 weight 域保存该结点的非负权值,设 root 为指向 T 的根结点的指针,请设计求 T 的 WPL 的算法。

算法的核心思想是先序遍历 + 计算层数,代码如下:

int WPL;

void WPL_PreOrder (BiTree T, int level)
    if (T != NULL)
        if ((T->lchild != NULL) && (T->rchild != NULL))
            WPL = WPL + T->weight * level;
        else if ((T->lchild != NULL) && (T->rchild == NULL))
            WPL_PreOrder(T->lchild, level + 1);
        else
            WPL_PreOrder(T->rchild, level + 1);
    


// main 函数中调用:
WPL_PreOrder(Tree, 0);

6 将表达式树转化为等价的中缀表达式

请设计一个算法,将给定的表达式树,转换成等价的中缀表达式并输出。

二叉树结点定义如下:

typedef struct node
    char data[10];
    struct node *left, * right;
 BTree;

算法的核心思想是中序遍历 + 计算层数。可以先将中序遍历的表达式先写出来,再与加了括号的表达式对比一下,看看哪个地方加了括号。遍历左子树前加上左括号,遍历完右子树后加上右括号,根结点(表达式最外层)和叶结点(操作数)不需要加括号。代码如下:

void InOrder (BTree *T, int level)
    if (T != NULL)
        if ((T->left == NULL) && (T->right == NULL)) // 叶结点
            输出 T->data; // 输出操作数
        else
            if (level > 1) // 若有子表达式则加 1 层括号
                输出 "(";
            InOrder(T->left, level + 1);
            输出 T->data; // 输出操作符
            InOrder(T->right, level + 1);
            if (level > 1) // 若有子表达式则加 1 层括号
                输出 ")";
        
    


// main 函数中调用:
InOrder(Tree, 0);

以上是关于数据结构-树二叉树的相关算法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-树二叉树的坡度

算法漫游指北(第十三篇):二叉树的基本概念满二叉树完全二叉树二叉树性质二叉搜索树二叉树定义二叉树的广度优先遍历

树二叉树查找算法总结

二叉树

树二叉树查找算法总结

数据结构学习笔记04树(二叉树二叉搜索树平衡二叉树)